¿Qué es el error "no asignable al parámetro de tipo nunca" en mecanografiado?


162

El código es:

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

Me sale el siguiente error de TS:

[ts] El argumento del tipo 'cadena' no se puede asignar al parámetro del tipo 'nunca'.

¿Qué estoy haciendo mal? ¿Es esto un error?

Respuestas:


251

Todo lo que tiene que hacer es definir su resultcomo una matriz de cadenas, como la siguiente:

const result : string[] = [];

Sin definir el tipo de matriz, por defecto será never. Entonces, cuando trataste de agregarle una cadena, fue un desajuste de tipo, y arrojó el error que viste.


66
Eso me parece extraño, ¿por qué predeterminado never[]? ¿hay algún uso para eso excepto "una matriz que SIEMPRE estará vacía?"
— Vincent Buscarello

66
Estoy totalmente de acuerdo porque, para ser sincero, no puedo pensar en un caso de uso en el que una serie de nevers sea útil. Pero mientras lo investigaba me encontré con esta respuesta que tiene una gran información.
— Tha'er M. Al-Ajlouni

8
¿No debería ser el tipo predeterminado "any"? Cuando declara una variable ( let x;), es de tipo anypor defecto. No never.
— Shachar Har-Shuv

1
Definitivamente esperaría que una matriz sin tipo sea any[]. Me sorprendió que fuera never[]lo que lo hace inútil. Poco intuitivo. Gracias por la respuesta. editar: gramática
— Igor Malyk

44
@VincentBuscarello, supongo, el punto principal de dicho valor predeterminado es hacer que uno siempre agregue tipos a sus matrices; pero el mensaje de error definitivamente no es útil.
— YakovL

27

Otra forma es:

const result = [] as  any;

8
En realidad, el uso anyno es una buena opción, ya que básicamente desactiva cualquier característica de TypeScript. Es una solución alternativa y puede provocar varios errores.
— Tomek Buszewski

1
Si. Pero a veces nada más funciona especialmente cuando se trabaja con bibliotecas de terceros ..
— neomib

14

Esto parece ser una regresión reciente o algún comportamiento extraño en el mecanografiado. Si tienes el código:

const result = []

Por lo general, se trataría como si escribieras:

const result:any[] = []

sin embargo, si tiene noImplicitAnyFALSO Y strictNullChecks VERDADERO en su tsconfig, se trata como:

const result:never[] = []

Este comportamiento desafía toda lógica, en mi humilde opinión. ¿Activar las comprobaciones nulas cambia los tipos de entrada de una matriz? ¿Y luego encenderlo noImplicitAnyrestaura el uso anysin advertencias?

Cuando realmente tienes una serie de any , no debería necesitar indicarlo con un código adicional.


10

Estaba teniendo el mismo error en la función sin estadísticas ReactJS mientras usaba ReactJs Hook useState . Quería establecer el estado de una matriz de objetos, así que si uso la siguiente manera

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

y actualice el estado así:

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

Recibía un error:

argumento de tipo '{id: número; text: any} 'no se puede asignar al parámetro de tipo' never '

pero si lo haces así,

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

El error desapareció pero hay un elemento en el índice 0 que no tiene ningún dato (no quiero eso).

entonces la solución que encontré es:

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

7

Obtuve el mismo error en el componente de función ReactJS, usando ReactJS useState hook. La solución fue declarar el tipo de estado de uso en la inicialización:

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

3

Pude superar esto usando la palabra clave Array en lugar de corchetes vacíos:

const enhancers: Array<any> = [];

Utilizar:

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

2

Necesita escribir resulten una matriz de cadena const result: string[] = [];.



1

Elimine "strictlyNullChecks": true de "compilerOptions" o configúrelo como falso en el archivo tsconfig.json de su aplicación Ng. Estos errores desaparecerán como cualquier cosa y su aplicación se compilará correctamente.

Descargo de responsabilidad : esto es solo una solución. Este error aparece solo cuando las comprobaciones nulas no se manejan correctamente, lo que en cualquier caso no es una buena manera de hacer las cosas.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.