Estoy tratando de usar un módulo JS en un archivo TypeScript. Pero, debido a que el módulo JS no tiene ninguna declaración de tipo, no puedo usar el módulo JS debido a errores de TypeScript.
El problema ocurre debido a un argumento predeterminado en la función importada de JS que TypeScript infiere como de un tipo cuando no lo es.
Sé que el problema probablemente solo existe debido al uso estúpido del argumento predeterminado y de una función mal escrita. Pero no puedo editar el módulo JS para corregirlo.
El verdadero problema es con un Componente React que tiene un accesorio que por defecto es false ( const El = ({prop1, prop2 = false})=>{...} ) pero también podría recibir un number . Luego, al llamar al componente en el archivo TS y al establecer ese accesorio en un número ( <El prop1={1} prop2={3}/> ), TypeScript se queja con "Argument of type 'number' is not assignable to parameter of type 'boolean | undefined'."
Para simplificar, aquí hay un ejemplo equivalente que no es de React:
Entonces, imaginemos que uno tiene un proyecto TypeScript con "allowJS": true establecido para que se pueda importar un módulo JS.
//externalModule.js //Can't edit this file export const addOneOrMore = (a, b = false) => { if(b == false) return a + 1 else return a + b } //typescriptFile.ts import addOneOrMore from "./externalModule.js" let one: number = 1 let three: number = 3 console.log(addOneOrMore(one,three)) // TS Error: "Argument of type 'number' is not assignable to parameter of type 'boolean | undefined'." Sé que lo que sucede es que el compilador de TS infiere que, debido a que el argumento predeterminado es false , es del tipo booleano. . Y por eso, no puedo pasarle un número.
Creo que en este caso no tiene mucho sentido inferir eso (al menos para módulos JS importados sin declaraciones de tipo)
Entonces, mis preguntas son:
: any ?boolean | undefined es ese caso? ¿Por qué undefined ? ¿Por qué es más probable que alguien pase activamente undefined específicamente a un argumento predeterminado que a cualquier otro tipo? ¿Por qué no boolean | null o algo mas?¡Muchas gracias!
El módulo JS no tiene declaraciones de tipo. […] Pero no puedo editar el módulo JS para corregirlo. […] ¿Hay alguna otra forma que me permita usar ese módulo en un archivo TS?
Sí, lo hay: ¡puede usar un archivo de declaración ! Simplemente cree el archivo externalModule.d.ts , coloque las declaraciones de tipo adecuadas en él y podrá usar la biblioteca tal como está.
En TypeScript 3.7, la verificación de tipos se desactivará en un archivo si comienza con el siguiente comentario:
// @ts-nocheckComo ya se mencionó, en versiones anteriores puede deshabilitar la verificación en una sola línea al incluir el siguiente comentario en la línea anterior:
// @ts-ignoreEn tu caso, puedes probar esto:
//typescriptFile.ts import addOneOrMore from "./externalModule.js" let one: number = 1 let three: number = 3 // @ts-ignore console.log(addOneOrMore(one,three))