javascript - Importar archivo js con TypeScript 2.0
Resumen
Estoy intentando importar un archivo ".js" desde una ubicación externa (es decir, node_modules). Estoy tratando de hacer esto usando el patrón de módulo commonjs, sin embargo, import no quiere funcionar con archivos tipo ".js" hasta que agrego un archivo ".d.ts" cerca del archivo ".js" en la misma carpeta.
Pero el problema es que no querría afectar ningún node_modules con mis archivos ".d.ts". Quiero que esté ubicado en otra carpeta, separada de node_modules, pero tan pronto como hago eso, el compilador de TypeScript lanza un error:
Ejemplo
Tengo la siguiente estructura de carpetas:
|- DTS
| |- y.d.ts
|- main.ts
|- y.js
y.js tiene el siguiente contenido
module.export = function (x) {
console.log(x);
};
y.d.ts tiene el siguiente contenido
export interface Y {
(x): any;
}
declare let y: Y;
export default y;
main.ts tiene el siguiente contenido
import * as y from './y'
Ahora, cuando intento compilar main.ts con:
tsc -m commonjs -t ES2015 main.ts
Obteneré un error:
x.ts(1,20): error TS2307: Cannot find module './y'.
Pregunta
Cómo importar archivos ".js" y poder definir sus declaraciones ".d.ts" mientras ambos archivos se encuentran en ubicaciones diferentes.
Editar
Aquí está el enlace al proyecto de ejemplo. Asegúrese de usar el compilador TypeScript versión 2.0. Y el comando tsc anterior para ver el error.
Respuesta #1
Nota: La recomendación oficial para probar tus definiciones de tipos toma un enfoque ligeramente diferente al que se presenta a continuación. Creo que el enfoque a continuación es ligeramente mejor, ya que el archivo *.d.ts es prácticamente idéntico al producto final.
Durante la verificación de tipos (tiempo de compilación) TypeScript trabaja con archivos *.ts y (principalmente) ignora los archivos *.js. Permíteme ofrecer un ejemplo que motiva lo que (creo) estás proponiendo. Supongamos que existe una biblioteca de JavaScript perfectamente buena que, lamentablemente, no tiene tipos (por ejemplo, N3). La cual ha sido instalada vía npm, así:
npm install n3 --save
Esto, como es habitual, se añade a ./node_modules/n3/... y project.json. Como se mencionó, los tipos no existen y necesitan ser añadidos manualmente. Creo un archivo ./@types/n3.d.ts con este propósito. Para nuestros propósitos, no es particularmente importante cuáles sean las definiciones realmente, pero algo como lo siguiente es un buen comienzo:
declare namespace N3 {
}
declare module "n3" {
export = N3;
}
Ahora a tu pregunta. Actualiza el 'tsconfig.json':
...
"compilerOptions": {
"typeRoots": [
"node_modules/@types",
"@types"
],
...
"paths": {
"*": [
...
"./@types/*"
]
Todavía será necesario lidiar con la resolución en tiempo de ejecución para localizar los archivos *.js correspondientes, pero esa es una cuestión diferente a la que usted preguntó.
Para referencia, puede encontrar útil Qué hay de nuevo en TypeScript y este hilo de discusión.
Este enfoque funciona bien al trabajar con variables globales, pero no tanto con módulos.
Actualiza el 'tsconfig.json':
...
"paths": {
"*": [
...
"./@types/*"
],
"foo": [ "./@types/foo.d.ts" ]
},
...
