Wystąpienie błędu „Nazwa modułu” powoduje, że podczas zapisywania niestandardowego pliku definicji TypeScript występuje moduł bez typu w… ”


89

Nie mogę znaleźć definicji TypeScript @type/{name}dla jednego z moich zainstalowanych pakietów NodeJS, więc próbuję napisać d.tsdla niego plik i umieścić go w {project root}\typingsfolderze. Oto jak to robię:

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

Jednak program Visual Studio Code nadal generuje ten błąd i umieszcza czerwoną linię pod declare module 'node-helper-lib':

[ts] Nieprawidłowa nazwa modułu w rozszerzeniu. Moduł „node-helper-lib” jest zastępowany jako moduł bez typu w „{ścieżka projektu} \ node_modules \ node-helper-lib \ index.js”, którego nie można rozszerzyć.

Czy nie jest to uzasadnione, ponieważ biblioteka jest nietypowa, więc powinienem mieć możliwość dodawania do niej pisania?

AKTUALIZACJA:

Ja używam:

  • TypeScript: 2.1.4
  • Kod programu Visual Studio: 1.9.1
  • Węzeł JS: 6.9.4
  • Windows 10 x64

Odpowiedzi:


151

Rzeczywiste rozwiązanie jest podane w komentarzu @Paleo w odpowiedzi @ hirikarate:

Import należy zadeklarować w deklaracji modułu.

Przykład:

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

21
Czy jest to gdzieś udokumentowane?
chris

12
Nie wiem, ile godzin zajęło mi znalezienie tego. Wielkie dzięki! Zdecydowanie powinno to być lepiej udokumentowane ...
Jonathan Gruber

Dlaczego w języku TypeScript nie ma dobrego komunikatu o błędzie lub czegoś takiego?
VitorLuizC

53

Po kilku próbach i błędach stwierdziłem, że augmentationoznacza to „deklarowanie modułu w tym samym pliku z innymi deklaracjami modułów”.

Dlatego jeśli chcemy napisać plik definicji dla nietypowej biblioteki JavaScript innej firmy, musimy mieć TYLKO JEDEN declare module 'lib-name'w tym pliku, a 'nazwa-biblioteki' musi dokładnie odpowiadać nazwie biblioteki (można ją znaleźć w pliku package.json, " name ”).

Z drugiej strony, jeśli biblioteka zewnętrzna ma już .d.ts dołączony plik definicji , a chcemy rozszerzyć jej funkcjonalności, to dodatkową definicję możemy umieścić w innym utworzonym przez nas pliku. To się nazywa augmenting.

Na przykład:

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

Zostawiam tutaj swoje odkrycie na wypadek, gdyby ktoś miał to samo pytanie. I proszę, popraw mnie, jeśli coś przeoczyłem.


1
Co należy zrobić, jeśli biblioteka innej firmy zawiera już plik definicji .d.ts, ale chciałbym go zignorować i użyć niestandardowego?
Alen Liang

24
Próbuję napisać plik definicji dla zupełnie nietypowego modułu npm, supertest- skarga TypeScript nawet nie ma sensu, jak mogę nie rozszerzyć czegoś, co nawet nie ma deklaracji? Myślałem, że wiele razy pisałem takie pliki z niestandardową definicją ... [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.- niestety @types/supertestjest zepsuty przez włączenie bibliotek DOM, które powodują, że jest uszkodzony ... wygląda na to, że nie mam szczęścia
ChaseMoskal

34
@ChaseMoskal: W swoim pliku .d.ts, może powinieneś po prostu przenieść cały import do deklarowanego modułu "nazwaModułu" {}.
Paleo,

17
@Paleo to było dokładnie to, wszystkie importwywołania muszą wchodzić w declare module 'module' {}zakres. błąd jest co najwyżej mylący
pocesar

2
maszynopis robi to samo, jeśli umieścisz importinstrukcje wymagane przez Twój moduł na zewnątrz declare modulezamiast wewnątrz niego. Takie nieintuicyjne dziwne zachowanie (przepraszam za to, że się narzekam).
binki

0

Otrzymałem również ten komunikat o błędzie. Problem polegał na tym, że próbowałem zadeklarować inny moduł w istniejącym pliku definicji typu, który zawierał deklarację modułu. Po przeniesieniu deklaracji nowego modułu do nowego pliku błąd zniknął.


-4

W moim przypadku po prostu użyłem następującej deklaracji w jednym z moich plików typów, więc mogłem użyć wszystkich pakietów nietypowych:

declare module '*'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.