El código es:
const foo = (foo: string) => { const result = [] result.push(foo) }Recibo el siguiente error de TS:
[ts] El argumento de tipo 'cadena' no se puede asignar al parámetro de tipo 'nunca'.
¿Qué estoy haciendo mal? ¿Es esto un error?
Todo lo que tiene que hacer es definir su result como una matriz de cadenas, como la siguiente:
const result : string[] = []; Sin definir el tipo de matriz, por defecto será never . Entonces, cuando intentó agregarle una cadena, era una falta de coincidencia de tipo, por lo que arrojó el error que vio.
Debe escribir result en una matriz de string const result: string[] = []; .
Otra forma es:
const result = [] as any;Esto parece ser un comportamiento extraño en el mecanografiado con el que están atascados por razones heredadas. Si tienes el código:
const result = []Por lo general, se trataría como si escribiera:
const result:any[] = [] sin embargo, si tiene noImplicitAny FALSE Y strictNullChecks TRUE en su tsconfig, se trata como:
const result:never[] = [] Este comportamiento desafía toda lógica, en mi humilde opinión. ¿Activar comprobaciones nulas cambia los tipos de entrada de una matriz? ¿Y luego activar noImplicitAny realmente restaura el uso de any sin ninguna advertencia?
Cuando realmente tiene una matriz de any , no debería necesitar indicarlo con código adicional.
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()) }Estaba teniendo el mismo error en la función sin estado de 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 actualizar el estado de esta manera:
const item = { id : new Date().getTime() , text : 'New Text' }; setItems([ item , ...items ]); Estaba recibiendo un error:
Argumento de tipo '{ id: número; text: any }' no se puede asignar a un parámetro de tipo 'nunca'
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);Elimine "strictNullChecks": verdadero 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á con éxito.
Descargo de responsabilidad: Esto es solo una solución. Este error aparece solo cuando los cheques nulos no se manejan correctamente, lo que en cualquier caso no es una buena manera de hacer las cosas.
Recibí el mismo error en el componente de la función ReactJS, usando el gancho useState de ReactJS.
La solución fue declarar el tipo de useState en la inicialización usando paréntesis angulares:
// Example: type of useState is an array of string const [items , setItems] = useState<string[]>([]);La solución que encontré fue
const [files, setFiles] = useState([] as any);Una razón más para el error.
si está exportando después de envolver el componente con connect () (), entonces los accesorios pueden dar un error de mecanografiado
Solución: no exploré mucho porque tenía la opción de reemplazar la función de conexión con el gancho useSelector
por ejemplo
/* Comp.tsx */ interface IComp { a: number } const Comp = ({a}:IComp) => <div>{a}</div> /* ** below line is culprit, you are exporting default the return value of Connect and there is no types added to that return value of that connect()(Comp) ** */ export default connect()(Comp) -- /* App.tsx */ const App = () => { /** below line gives same error [ts] Argument of type 'number' is not assignable to parameter of type 'never' */ return <Comp a={3} /> }Error: el argumento de tipo 'cualquiera' no se puede asignar al parámetro de tipo 'nunca'.
En tsconfig.json -
"noImplicitReturns": false, "strictNullChecks":false,Solución: escriba como 'nunca'
también podría agregar as string[]
const foo = (foo: string) => { const result = [] (result as string[]).push(foo) }Lo hice cuando era parte de un objeto.
let complexObj = { arrData : [], anotherKey: anotherValue ... } (arrData as string[]).push('text')Suponiendo que su linter esté bien con "cualquier" tipo:
Si no conoce el tipo de valores que llenarán la matriz, puede hacerlo y el resultado inferirá el tipo.
const result: any[] = []Todo lo que tiene que hacer es definir su resultado como una matriz cualquiera, como la siguiente:
resultado: cualquier = [];
Recibí el error al definir (inicializar) una matriz de la siguiente manera:
let mainMenu: menuObjectInterface[] | [] = [];El código en el que tengo el problema:
let mainMenu: menuObjectInterface[] | [] = []; dbresult.rows.forEach((m) => { if (!mainMenu.find((e) => e.menucode === m.menucode)) { // Not found in mainMenu, yet mainMenu.push({menucode: m.menucode, menudescription: m.menudescription}) // Here the error } })El error fue: TS2322: el tipo 'cualquiera' no se puede asignar al tipo 'nunca'
La razón fue que la matriz se inicializó también con la opción de una matriz vacía. Typescript vio un empujón a un tipo que también puede estar vacío. De ahí el error.
Cambiar la línea a esto solucionó el error:
let mainMenu: menuObjectInterface[] = [];