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
hirikarate
źródło

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;
}
Lee Benson
źródło
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.

hirikarate
źródło
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ął.

G-Wiz
źródło
-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 '*'
Alexey
źródło