Der Fehler "Modulname" wird beim Schreiben einer benutzerdefinierten TypeScript-Definitionsdatei in ein untypisiertes Modul um ... aufgelöst


90

Ich kann die TypeScript-Definition @type/{name}für eines meiner installierten NodeJS-Pakete nicht finden , daher versuche ich, eine d.tsDatei dafür zu schreiben und die Datei in einem {project root}\typingsOrdner abzulegen . So mache ich:

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

Visual Studio Code gibt jedoch weiterhin diesen Fehler aus und setzt eine rote Linie unter declare module 'node-helper-lib':

[ts] Ungültiger Modulname in Erweiterung. Das Modul 'node-helper-lib' wird in ein untypisiertes Modul unter '{Projektpfad} \ node_modules \ node-helper-lib \ index.js' aufgelöst, das nicht erweitert werden kann.

Ist es nicht legitim, dass ich, weil die Bibliothek untypisiert ist, die Möglichkeit haben sollte, sie zu tippen?

AKTUALISIEREN:

Ich benutze:

  • TypeScript: 2.1.4
  • Visual Studio-Code: 1.9.1
  • Knoten JS: 6.9.4
  • Windows 10 x64

Antworten:


152

Die tatsächliche Lösung wird in einem Kommentar von @Paleo in der Antwort von @ hirikarate angegeben:

Importe sollten innerhalb der Moduldeklaration deklariert werden.

Beispiel:

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

22
Ist das irgendwo dokumentiert?
Chris

13
Ich weiß nicht, wie viele Stunden ich gebraucht habe, um das endlich zu finden. Vielen Dank! Dies sollte auf jeden Fall besser dokumentiert werden ...
Jonathan Gruber

1
Warum hat TypeScript keine gute Fehlermeldung oder ähnliches?
VitorLuizC

54

Nach einigen Versuchen und Fehlern stellte ich fest, dass dies augmentationbedeutet, dass ein Modul in derselben Datei mit anderen Moduldeklarationen deklariert wird.

Wenn wir also eine Definitionsdatei für eine untypisierte JavaScript-Bibliothek eines Drittanbieters schreiben möchten , müssen wir NUR EINE declare module 'lib-name'in dieser Datei haben, und 'lib-name' muss genau mit dem Bibliotheksnamen übereinstimmen (finden Sie in der Datei package.json, " Name "Eigenschaft).

Wenn in einer Bibliothek eines Drittanbieters bereits eine Definitionsdatei .d.ts enthalten ist und wir deren Funktionen erweitern möchten, können wir die zusätzliche Definition in eine andere von uns erstellte Datei einfügen. Dies nennt man augmenting.

Zum Beispiel:

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

Ich lasse meine Entdeckung hier, nur für den Fall, dass jemand die gleiche Frage hat. Und bitte korrigieren Sie mich, wenn ich etwas verpasst habe.


1
Was kann ich tun, wenn in einer Bibliothek eines Drittanbieters bereits die Definitionsdatei .d.ts enthalten ist, ich diese jedoch ignorieren und eine benutzerdefinierte verwenden möchte?
Alen Liang

24
Ich versuche, eine Definitionsdatei für ein vollständig untypisiertes npm-Modul zu schreiben. supertest- Die Beschwerde von TypeScript macht nicht einmal Sinn. Wie kann ich etwas nicht erweitern, das nicht einmal eine Deklaration enthält? Ich dachte, ich hätte schon oft benutzerdefinierte Definitionsdateien wie diese geschrieben ... [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.- ist leider @types/supertestkaputt,
weil

35
@ChaseMoskal: In Ihrer Datei .d.tssollten Sie möglicherweise den gesamten Import in das Deklarationsmodul "moduleName" {} verschieben.
Paleo

17
@Paleo das war es genau, alle importAnrufe müssen in den declare module 'module' {}Geltungsbereich gehen . Der Fehler ist bestenfalls irreführend
Pocesar

2
Typoskript macht dasselbe, wenn Sie die importvon Ihrem Modul benötigten Anweisungen außerhalb von declare modulestatt innerhalb von platzieren. Solch ein unintuitives, merkwürdiges Verhalten (Entschuldigung, dass Sie hier geschimpft haben).
Binki

0

Ich habe auch diese Fehlermeldung erhalten. Das Problem für mich war, dass ich versuchte, ein anderes Modul in einer vorhandenen Typdefinitionsdatei zu deklarieren, die eine Moduldeklaration enthielt. Nachdem ich die neue Moduldeklaration in eine neue Datei verschoben hatte, verschwand der Fehler.


-4

In meinem Fall habe ich nur die folgende Deklaration in einer meiner Typendateien verwendet, damit ich alle Nicht-Typoskript-Pakete verwenden konnte:

declare module '*'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.