node.js - Tener el error "Módulo ''nombre'' se resuelve en un módulo sin tipo en..." al escribir un archivo de definición de TypeScript personalizado
typescript-typings typescript2.1 (4)
No puedo encontrar la definición de TypeScript
@type/{name}
para uno de mis paquetes NodeJS instalados, así que intento escribir un archivo
d.ts
para él y colocar el archivo en la carpeta
{project root}/typings
.
Así es como lo hago:
// My source code: index.ts
import Helper from ''node-helper-lib'';
// My definition: /typings/node-helper-lib.d.ts
declare....(something else)
declare module ''node-helper-lib'' {
class Helper { ... }
export = Helper;
}
Sin embargo, Visual Studio Code sigue produciendo este error y coloca la línea roja debajo del
declare module ''node-helper-lib''
:
[ts] Nombre de módulo no válido en aumento. El módulo ''node-helper-lib'' se resuelve en un módulo sin tipo en ''{ruta del proyecto} / node_modules / node-helper-lib / index.js'', que no se puede aumentar.
¿No es legítimo que debido a que la biblioteca no está tipificada, por lo que debería permitirme agregarle tipeo?
ACTUALIZAR:
Estoy usando:
- TypeScript: 2.1.4
- Código de Visual Studio: 1.9.1
- Nodo JS: 6.9.4
- Windows 10 x64
Después de algunos intentos y errores, descubrí que el
augmentation
significa "declarar un módulo en el mismo archivo con otras declaraciones de módulo".
Por lo tanto, si queremos escribir un archivo de definición para una biblioteca de JavaScript de terceros sin tipo, debemos tener SOLO UN
declare module ''lib-name''
en ese archivo, y ''lib-name'' debe coincidir exactamente con el nombre de la biblioteca (se puede encontrar en su package.json, propiedad "nombre").
Por otro lado, si una biblioteca de terceros
ya tiene el archivo de definición
.d.ts
incluido, y queremos ampliar sus funcionalidades, entonces podemos poner la definición adicional en otro archivo que creamos.
Esto se llama
augmenting
.
Por ejemplo:
// These module declarations are in same file, given that each of them already has their own definition file.
declare module ''events'' {
// Extended functionality
}
declare module ''querystring'' {
// Extended functionality
}
declare module ''...'' { ... }
Dejo mi descubrimiento aquí por si alguien tiene la misma pregunta. Y corrígeme si me pierdo algo.
En mi caso, solo utilicé la siguiente declaración en uno de mis archivos de tipos, así que pude usar todos los paquetes que no son de tipo mecanografiado:
declare module ''*''
La solución real se da en un comentario de @Paleo en la respuesta de @ hirikarate:
Las importaciones deben declararse dentro de la declaración del módulo.
Ejemplo:
declare module ''node-helper-lib'' {
import * as SomeThirdParty from ''node-helper-lib'';
interface Helper {
new(opt: SomeThirdParty.Options): SomeThirdParty.Type
}
export = Helper;
}
También recibí ese mensaje de error. El problema para mí fue que estaba tratando de declarar otro módulo en un archivo de definición de tipo existente que tenía una declaración de módulo. Después de mover la declaración del nuevo módulo a un nuevo archivo, el error desapareció.