javascript - Importar archivo js con TypeScript 2.0
node.js typescript2.0 (2)
Resumen
Estoy tratando de importar el archivo ".js" desde una ubicación externa (es decir, node_modules ) Estoy tratando de hacer esto usando el patrón del módulo commonjs, sin embargo, la importación no querría trabajar con los tipos de archivos ".js" hasta que agregué " .d.ts archivo "cerca del archivo" .js "en la misma carpeta.
Pero el problema es que no me gustaría afectar a ningún nodo_módulos con mis archivos ".d.ts". Quiero que se ubique en otra carpeta, separada de los node_modules, pero tan pronto como lo hago, el compilador de escritura de tipos produce 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);
};
ydts 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 estoy tratando de compilar main.ts con:
tsc -m commonjs -t ES2015 main.ts
Obtendré un error:
x.ts(1,20): error TS2307: Cannot find module ''./y''.
Pregunta
Cómo importar archivos ".js" y ser capaz de definir sus declaraciones ".d.ts" al tener ambos archivos ubicados en diferentes ubicaciones.
Editar
Aquí está el enlace al proyecto de ejemplo . Asegúrese de utilizar el compilador de TypeScript versión 2.0. Y el comando tsc
arriba para ver el error.
pudiendo definir sus declaraciones ".d.ts" al tener ambos archivos ubicados en diferentes ubicaciones.
import
sigue el mismo proceso de resolución del módulo cuando se le entrega un archivo .js
o .d.ts
con archivos relativos.
Nota: La recomendación oficial para probar sus definiciones de tipo 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 comprobación de tipos (tiempo de compilación), TypeScript funciona con archivos * .ts y (en su mayoría) ignora archivos * .js . Permítame ofrecerle un ejemplo que motive lo que (creo) está proponiendo. Supongamos que existe una biblioteca de JavaScript perfectamente buena que, lamentablemente, no tiene mecanografía (por ejemplo, N3 ). Que se ha instalado a través de npm, por lo tanto:
npm install n3 --save
Esto, como es típico, se agrega a ./node_modules/n3 / ... y project.json. Como se mencionó, las tipificaciones no existen y deben agregarse manualmente. Creo un archivo ./@types/n3.d.ts para este propósito. Para nuestros propósitos, no es particularmente importante cuáles son las definiciones en realidad, pero algo como lo siguiente es un buen comienzo:
declare namespace N3 {
}
declare module "n3" {
export = N3;
}
Ahora a tu pregunta. Actualice 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 ubicar los archivos * .js correspondientes, pero esa es una pregunta diferente a la pregunta.
Como referencia, puede encontrar útiles las novedades de TypeScript y este hilo de discusión .
Este enfoque funciona bien cuando se trabaja con variables globales pero no tanto con módulos.
Actualice el '' tsconfig.json '':
...
"paths": {
"*": [
...
"./@types/*"
],
"foo": [ "./@types/foo.d.ts" ]
},
...