El error "Nombre del módulo se resuelve en un módulo sin tipo en ..." al escribir un archivo de definición de TypeScript personalizado

89

No puedo encontrar la definición de TypeScript @type/{name}para uno de mis paquetes NodeJS instalados, así que intento escribir un d.tsarchivo para él y poner el archivo en la {project root}\typingscarpeta. 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 pone una línea roja debajo 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á mecanografiada, se me debería permitir agregar escritura?

ACTUALIZAR:

Estoy usando:

  • TypeScript: 2.1.4
  • Código de Visual Studio: 1.9.1
  • Nodo JS: 6.9.4
  • Windows 10 x64
hirikarate
fuente

Respuestas:

151

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;
}
Lee Benson
fuente
21
¿Está esto documentado en alguna parte?
chris
12
No sé cuántas horas me tomó finalmente encontrar esto. ¡Muchas gracias! Esto definitivamente debería estar mejor documentado ...
Jonathan Gruber
¿Por qué TypeScript no tiene un buen mensaje de error o algo así?
VitorLuizC
53

Después de algunos intentos y errores, descubrí que eso augmentationsignifica "declarar un módulo en el mismo archivo con otra declaración de módulo".

Por lo tanto, si queremos escribir un archivo de definición de un tipo asignado biblioteca de JavaScript 3 ª parte, hay que tener sólo una declare module 'lib-name'en ese archivo, y 'lib-nombre' debe coincidir exactamente con el nombre de la biblioteca (se puede encontrar en su package.json " nombre "propiedad).

Por otro lado, si una biblioteca de terceros ya tiene un archivo de definición .d.ts incluido y queremos ampliar sus funcionalidades, entonces podemos poner la definición adicional en otro archivo que creamos. A esto se le 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 perdí algo.

hirikarate
fuente
1
¿Qué debo hacer si una biblioteca de terceros ya tiene el archivo de definición .d.ts incluido, pero me gustaría ignorarlo y usar uno personalizado?
Alen Liang
24
Estoy tratando de escribir un archivo de definición para un módulo npm completamente sin tipo, supertestla queja de TypeScript ni siquiera tiene sentido, ¿cómo no puedo aumentar algo que ni siquiera tiene una declaración? Pensé que había escrito archivos de definición personalizados como este muchas veces ... [ts] Invalid module name in augmentation. Module 'supertest' resolves to an untyped module at '/home/chase/Desktop/projects/formuoli/node_modules/supertest/index.js', which cannot be augmented.- desafortunadamente @types/supertestse rompe al incluir bibliotecas DOM que lo hacen roto ... parece que no tengo suerte
ChaseMoskal
34
@ChaseMoskal: En su archivo .d.ts, tal vez debería mover toda la importación al módulo de declaración "moduleName" {}.
Paleo
17
@Paleo eso fue exactamente, todas las importllamadas deben entrar dentro del declare module 'module' {}alcance. el error es engañoso en el mejor de los casos
pocesar
2
Mecanografiado hace lo mismo si coloca las importdeclaraciones requeridas por su módulo fuera del en declare modulelugar de dentro. Un comportamiento extraño tan poco intuitivo (lo siento por despotricar aquí).
binki
0

También recibía 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ó.

G-Wiz
fuente
-4

En mi caso, solo usé la siguiente declaración en uno de mis archivos de tipos, por lo que pude usar todos los paquetes no mecanografiados:

declare module '*'
Alexey
fuente