angular - Är en typings-fil utan några deklarerade moduler meningsfull?
Jag försöker lista ut hur man använder typings-filer i mitt Angular-projekt. Men alla guider eller SO-inlägg verkar bara säga att man ska importera den deklarerade modulen i typings-filen. I mitt fall (gridstack.js) har den inga deklarerade moduler, bara gränssnitt och ett deklarerat namnrymd.
Jag har deklarerat gridstack i tsconfig.filen under types. Och jag kan t.ex. deklarera en variabel av typen IGridstackOptions utan kompileringsfel, men jag får ett körfel som säger C:/myPath/src/app/other-route/other-route.component.ts (16,60): Kan inte hitta namnet 'IGridstackOptions'.
Vet någon vad jag gör fel? Och är det meningsfullt att ha en typningsfil utan deklarerade moduler? Om ja, kan du förklara resonemanget bakom detta?
Tack :)
Svar #1
Du kan använda ett bibliotek i JavaScript på två sätt:
- använder det globala bibliotekobjektet
- importerar biblioteksobjekt
Fram tills nyligen använde de flesta bibliotek främst den första metoden och lade till globala objekt. Till exempel jQuerys globala objekt. Numera paketerar de flesta bibliotek sina bibliotek som UMD-moduler, vilket möjliggör användning av biblioteket som ett globalt objekt eller som import om koden körs i en modulstödjande miljö.
Typescript definierar två sätt som kan användas för att definiera deklarationer:
declare namespace NodeJS
declare module "buffer"
Den första definierar ett objekt (namespace, vanligtvis globalt), medan den andra definierar en modul. Se här.
Typsnittsfilerna för gridstack-biblioteket definierar ett globalt objekt:
declare namespace GridStackUI
och detta är också vad som görs inne i koden:
(function($, _) {
var scope = window;
...
return scope.GridStackUI;
});
Och det kan användas i din kod på detta sätt:
declare const gridstack: GridStack;
Men inuti gridstack.js finns det också en UMD-moduldefinition så att den kan användas i en modulstödd miljö så här:
import * as gridstack from 'gridstack';
Men typings-filen har inga deklarationer för det användandet.
