Qu'est-ce que l'erreur «non assignable au paramètre de type jamais» dans le typographie?


163

Le code est:

const foo = (foo: string) => {
  const result = []
  result.push(foo)
}

J'obtiens l'erreur TS suivante:

[ts] L'argument de type 'string' n'est pas assignable au paramètre de type 'never'.

Qu'est-ce que je fais mal? Est-ce un bug?

Réponses:


254

Tout ce que vous avez à faire est de définir votre resultcomme un tableau de chaînes, comme suit:

const result : string[] = [];

Sans définir le type de tableau, il le sera par défaut never. Ainsi, lorsque vous avez essayé d'y ajouter une chaîne, il s'agissait d'une incompatibilité de type, et cela a donc généré l'erreur que vous avez vue.


7
Cela me semble bizarre, pourquoi par défaut never[]? y a-t-il jamais une utilisation pour cela sauf "un tableau qui sera TOUJOURS vide?"
— Vincent Buscarello

7
Je suis tout à fait d'accord car, pour être honnête, je ne peux pas penser à un cas d'utilisation où un tableau de nevers sera utile. Mais en y regardant, je suis tombé sur cette réponse qui contient de bonnes informations.
— Tha'er M. Al-Ajlouni

9
Le type par défaut ne devrait-il pas être "any"? Lorsque vous déclarez une variable ( let x;), elle est de type anypar défaut. Non never.
— Shachar Har-Shuv

1
Je m'attendrais certainement à ce qu'un tableau sans type soit any[]. A été surpris que ce soit never[]ce qui le rend inutile. Pas intuitif. Merci d'avoir répondu. edit: grammar
— Igor Malyk

4
@VincentBuscarello Je suppose que le point principal d'une telle valeur par défaut est d'en faire un pour toujours ajouter des types à leurs tableaux; mais le message d'erreur n'est certainement pas utile.
— YakovL

28

Une autre façon est:

const result = [] as  any;

8
En fait, l'utilisation anyn'est pas une bonne option, car elle désactive essentiellement toutes les fonctionnalités de TypeScript. C'est une solution de contournement et peut conduire à divers bogues.
— Tomek Buszewski

1
Oui. Mais parfois, rien d'autre ne fonctionne, surtout lorsque vous travaillez avec des bibliothèques tierces ..
— neomib

14

Cela semble être une régression récente ou un comportement étrange dans le tapuscrit. Si vous avez le code:

const result = []

Habituellement, ce serait traité comme si vous écriviez:

const result:any[] = []

cependant, si vous avez noImplicitAnyFALSE et AND strictNullChecks TRUE dans votre tsconfig, il est traité comme:

const result:never[] = []

Ce comportement défie toute logique, à mon humble avis. L'activation des vérifications nulles modifie les types d'entrée d'un tableau ?? Et puis allumernoImplicitAny rétablit réellement l'utilisation de anysans aucun avertissement ??

Lorsque vous avez vraiment un tableau de any, vous ne devriez pas avoir besoin de l'indiquer avec du code supplémentaire.


10

J'avais la même erreur dans la fonction sans état ReactJS lors de l'utilisation de ReactJs Hook useState . Je voulais définir l'état d'un tableau d'objets, donc si j'utilise la manière suivante

const [items , setItems] = useState([]);

et mettez à jour l'état comme ceci:

 const item = { id : new Date().getTime() , text : 'New Text' };
 setItems([ item , ...items ]);

J'obtenais une erreur:

Argument de type '{id: number; text: any} 'n'est pas assignable au paramètre de type' never '

mais si fais-le comme ça,

const [items , setItems] = useState([{}]);

L'erreur a disparu mais il y a un élément à l' index 0 qui ne contient aucune donnée (je ne le veux pas)

donc la solution que j'ai trouvée est:

const [items , setItems] = useState([] as any);

7

J'ai eu la même erreur dans le composant de fonction ReactJS, en utilisant le hook useState de ReactJS. La solution était de déclarer le type de useState lors de l'initialisation:

const [items , setItems] = useState<IItem[]>([]); // replace IItem[] with your own typing: string, boolean...

3

J'ai pu surmonter cela en utilisant le mot-clé Array au lieu de crochets vides:

const enhancers: Array<any> = [];

Utilisation:

if (typeof devToolsExtension === 'function') {
  enhancers.push(devToolsExtension())
}

2

Vous devez saisir resultun tableau de chaînes const result: string[] = [];.



1

Supprimez "strictNullChecks": true de "compilerOptions" ou définissez-le sur false dans le fichier tsconfig.json de votre application Ng. Ces erreurs disparaîtront comme n'importe quoi et votre application se compilerait avec succès.

Avertissement : Ceci est juste une solution de contournement. Cette erreur n'apparaît que lorsque les vérifications nulles ne sont pas gérées correctement, ce qui n'est en aucun cas un bon moyen de faire avancer les choses.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.