Ter o erro “'nome' do módulo resolve para um módulo não digitado em ...” ao escrever o arquivo de definição TypeScript personalizado

90

Não consigo encontrar a definição do TypeScript @type/{name}para um dos meus pacotes NodeJS instalados, então tento escrever um d.tsarquivo para ele e coloco o arquivo na {project root}\typingspasta. É assim que eu faço:

// 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;
}

No entanto, o Visual Studio Code continua gerando esse erro e coloca uma linha vermelha abaixo de declare module 'node-helper-lib':

[ts] Nome de módulo inválido em aumento. O módulo 'node-helper-lib' é resolvido para um módulo não tipado em '{caminho do projeto} \ node_modules \ node-helper-lib \ index.js', que não pode ser aumentado.

Não é legítimo que, como a biblioteca não foi digitada, eu deveria ter permissão para adicionar digitação a ela?

ATUALIZAR:

Estou usando:

  • TypeScript: 2.1.4
  • Código do Visual Studio: 1.9.1
  • Nó JS: 6.9.4
  • Windows 10 x64
hirikarate
fonte

Respostas:

155

A solução real é dada em um comentário de @Paleo na resposta de @hirikarate:

As importações devem ser declaradas dentro da declaração do módulo.

Exemplo:

declare module 'node-helper-lib' {
   import * as SomeThirdParty from 'node-helper-lib';
   interface Helper {
       new(opt: SomeThirdParty.Options): SomeThirdParty.Type
   }
   export = Helper;
}
Lee Benson
fonte
55

Depois de algumas tentativas e erros, descobri que augmentationsignifica "declarar um módulo no mesmo arquivo com outra (s) declaração (ões) de módulo".

Portanto, se quisermos escrever um arquivo de definição para uma biblioteca JavaScript de terceiros não digitada , devemos ter APENAS UM declare module 'lib-name'nesse arquivo, e 'lib-name' deve corresponder exatamente ao nome da biblioteca (pode ser encontrado em seu package.json, " nome "propriedade).

Por outro lado, se uma biblioteca de terceiros já possui arquivo de definição .d.ts incluído, e queremos estender suas funcionalidades, então podemos colocar a definição adicional em outro arquivo que criarmos. Isso é chamado augmenting.

Por exemplo:

// 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 '...' { ... }

Deixo minha descoberta aqui apenas no caso de alguém ter a mesma pergunta. E, por favor, me corrija se eu perder algo.

hirikarate
fonte
1
O que devo fazer se uma biblioteca de terceiros já tiver um arquivo de definição .d.ts incluído, mas gostaria de ignorá-lo e usar um personalizado?
Alen Liang,
24
Estou tentando escrever um arquivo de definição para um módulo npm completamente sem tipo, supertest- a reclamação do TypeScript nem mesmo faz sentido, como posso não aumentar algo que nem mesmo tem uma declaração? Eu pensei que já escrevi arquivos de definição personalizados como este muitas vezes ... [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.- infelizmente @types/supertestestá quebrado ao incluir bibliotecas DOM que o renderizam .. parece que estou sem sorte
ChaseMoskal
35
@ChaseMoskal: Em seu arquivo .d.ts, talvez você deva apenas mover todas as importações para o módulo de declaração "moduleName" {}.
Paleo
17
@Paleo era exatamente isso, todas as importchamadas devem entrar no declare module 'module' {}escopo. o erro é enganoso na melhor das hipóteses
pocesar
2
O typescript faz a mesma coisa se você colocar as importinstruções exigidas por seu módulo fora do em declare modulevez de dentro dele. Comportamento estranho tão pouco intuitivo (desculpe por reclamar aqui).
binki,
0

Eu estava recebendo aquela mensagem de erro também. O problema para mim era que eu estava tentando declarar outro módulo em um arquivo de definição de tipo existente que continha uma declaração de módulo. Depois de mover a declaração do novo módulo para um novo arquivo, o erro foi embora.

G-Wiz
fonte
-4

No meu caso, eu apenas usei a seguinte declaração em um dos meus arquivos de tipos, então fui capaz de usar todos os pacotes não-typescript:

declare module '*'
Alexey
fonte