L'errore "Nome del modulo" si risolve in un modulo non tipizzato in ... "durante la scrittura del file di definizione TypeScript personalizzato


90

Non riesco a trovare la definizione TypeScript @type/{name}per uno dei miei pacchetti NodeJS installati, quindi provo a scrivere un d.tsfile per esso e metto il file nella {project root}\typingscartella. Ecco come faccio:

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

Tuttavia, Visual Studio Code continua a restituire questo errore e mette una linea rossa sotto declare module 'node-helper-lib':

[ts] Nome modulo non valido nell'aumento. Il modulo 'node-helper-lib' si risolve in un modulo non tipizzato in '{project path} \ node_modules \ node-helper-lib \ index.js', che non può essere aumentato.

Non è legittimo perché la libreria non è tipizzata, quindi dovrei essere autorizzato ad aggiungervi la digitazione?

AGGIORNARE:

Sto usando:

  • TypeScript: 2.1.4
  • Codice di Visual Studio: 1.9.1
  • Nodo JS: 6.9.4
  • Windows 10 x64

Risposte:


155

La soluzione effettiva è data in un commento di @Paleo nella risposta di @ hirikarate:

Le importazioni dovrebbero essere dichiarate all'interno della dichiarazione del modulo.

Esempio:

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

55

Dopo alcuni tentativi ed errori, ho scoperto che augmentationsignifica "dichiarare un modulo nello stesso file con altre dichiarazioni di modulo".

Pertanto, se vogliamo scrivere un file di definizione per una libreria JavaScript di terze parti non tipizzata , dobbiamo averne SOLO UNO declare module 'lib-name'in quel file e 'lib-name' deve corrispondere esattamente al nome della libreria (può essere trovato nel suo package.json, " nome "proprietà).

D'altra parte, se una libreria di terze parti ha già un file di definizione .d.ts incluso e vogliamo estendere le sue funzionalità, possiamo inserire la definizione aggiuntiva in un altro file che creiamo. Questo si chiama augmenting.

Per esempio:

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

Lascio qui la mia scoperta nel caso qualcuno avesse la stessa domanda. E per favore correggimi se mi sono perso qualcosa.


1
Cosa devo fare se una libreria di terze parti ha già il file di definizione .d.ts incluso, ma vorrei ignorarlo e usarne uno personalizzato?
Alen Liang

24
Sto cercando di scrivere un file di definizione per un modulo npm completamente non tipizzato, supertest- Il reclamo di TypeScript non ha nemmeno senso, come posso non aumentare qualcosa che non ha nemmeno una dichiarazione? Pensavo di aver scritto file di definizione personalizzati come questo molte volte ... [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.- sfortunatamente @types/supertestè rotto includendo le librerie DOM che lo rendono rotto .. sembra che io sia sfortunato
ChaseMoskal

35
@ChaseMoskal: Nel tuo file .d.ts, forse dovresti semplicemente spostare tutte le importazioni nel modulo di dichiarazione "moduleName" {}.
Paleo

17
@Paleo era esattamente così, tutte le importchiamate devono rientrare declare module 'module' {}nell'ambito. l'errore è fuorviante nella migliore delle
ipotesi

2
dattiloscritto fa la stessa cosa se metti le importistruzioni richieste dal tuo modulo all'esterno declare moduleinvece che al suo interno. Un comportamento così strano e poco intuitivo (mi dispiace per il ranting qui).
binki

0

Ricevo anche quel messaggio di errore. Il problema per me era che stavo cercando di dichiarare un altro modulo in un file di definizione del tipo esistente che conteneva una dichiarazione di modulo. Dopo aver spostato la nuova dichiarazione del modulo in un nuovo file, l'errore è scomparso.


-4

Nel mio caso ho appena usato la seguente dichiarazione in uno dei miei file di tipo, quindi sono stato in grado di utilizzare tutti i pacchetti non dattiloscritti:

declare module '*'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.