9

Używam komponentu React o nazwie shiitake od npm do mojego projektu, w którym używam TypeScript. Ta biblioteka nie ma deklaracji TypeScript, więc pomyślałem, że ją napiszę. Plik deklaracja wygląda jak poniżej (może nie być kompletna, ale nie martw się o tym zbyt dużo):Niestandardowe pliki deklaracji TypeScript dla nienumerowanych modułów npm

import * as React from 'react'; 

declare module 'shiitake' { 

    export interface ShiitakeProps { 
     lines: number; 
    } 

    export default class Shiitake extends React.Component<ShiitakeProps, any> { 
    } 
} 

Włożyłem to wewnątrz ./typings/shiitake.d.ts pliku i na Kodeksie VS widzę poniższy błąd:

[ts] Invalid module name in augmentation. Module 'shiitake' resolves to an untyped module at 'd:/dev/foo/foobar.foo.Client.Web/node_modules/shiitake/dist/index.js', which cannot be augmented.

po stronie konsumpcji, ja wciąż się ten sam błąd, nawet jeśli z powyższą deklaracją (ponieważ mam noImplicitAny przełącznik kompilator włączony):

/// <reference path="../../../../typings/shiitake.d.ts" /> 
import * as React from 'react'; 
import Shiitake from 'shiitake'; 

[ts] Could not find a declaration file for module 'shiitake'. 'd:/dev/foo/foobar.foo.Client.Web/node_modules/shiitake/dist/index.js' implicitly has an 'any' type.

Podstawową przyczyną gromadzenia plików deklaracji dla tego typu modułów jest @types/ way i działa dobrze. Jednak nie mogę uzyskać niestandardowych typów pisowni. jakieś pomysły?

Odpowiedz

26

deklaracja declare module 'shiitake'; powinna mieć zasięg globalny. tj. deklaracja najwyższego poziomu w module innym niż moduł (gdzie moduł jest plikiem z co najmniej jednym najwyższym poziomem import lub export).

Deklaracja w formularzu declare module '...' { } w module jest rozszerzeniem, patrz https://github.com/Microsoft/TypeScript-Handbook/blob/fa9e2be1024014fe923d44b1b69d315e8347e444/pages/Declaration%20Merging.md#module-augmentation po więcej szczegółów.

Więc chcesz ten plik wyglądał:

declare module 'shiitake' { 

    import * as React from 'react'; 

    export interface ShiitakeProps { 
     lines: number; 
    } 

    export default class Shiitake extends React.Component<ShiitakeProps, any> { 
    } 
} 
+0

Wow, wielkie dzięki za to. Oszczędzasz czas – smac89

+3

To była wielka pomoc, dziękuję. Dla mnie problemem było to, że instrukcja 'import' znajdowała się poza modułem, a nie wewnątrz. – dbellizzi

+0

Chciałbym móc to powtórzyć dziesięć razy. Spędziłem w tym czasie wiele godzin. Naprawdę chciałbym, żeby dokumenty TypeScript były lepsze. –

0

miałem dzisiaj ten sam problem.

Okazuje się, że wkleiłem wyeksportowane interfejsy poza deklaracją modułu. Plik typowań użyty jako szablon miał prywatne interfejsy na końcu pliku.

Moje wyeksportowane interfejsy zostały zadeklarowane poza deklaracją modułu. To jest napęd nakrętek kompilatora maszynopisu.

Po przeniesieniu interfejsów do granic modułów wszystko zostało naprawione.

0

Z mojego doświadczenia wynika, że ​​plik definicji zawodzi w ten sposób, jeśli ma jakiś eksport lub importuje zadeklarowany poza definicją modułu. Jeśli korzystasz z IDE z auto-importem, ostrzeż się!

Powiązane problemy