javascript - Hur skriver man TypeScript-definitionsfiler för ett nytt bibliotek?


Om du skulle skriva ditt eget open source TypeScript-bibliotek, hur skulle du strukturera TypeScript och TypeScript-definitionerna? Såvitt jag förstår finns definitionsfilerna egentligen där för kompilatorn, så att när ditt bibliotek används finns IntelliSense för att hjälpa användaren.

Men hur fungerar definitionsfiler internt när man utvecklar ett bibliotek? Skulle du lägga alla dina typer (gränssnitt, klasser, etc.) i en {module}.d.ts-fil och referera till definitionsfilen internt så att du inte behöver skriva typerna två gånger (en gång i {module}.ts och en gång i {module}.d.ts)?

I TypeScript-kompilatorns alternativ, vad är poängen med att sätta "declaration" till true? För mig verkar det inte användbart att automatisera skapandet av definitionsfilen om den inte kommer att vara särskilt hjälpsam (dvs. kommentarer).

Om ditt bibliotek har flera moduler, skulle du skriva separata definitioner för varje modul och lägga till referenser mellan definitionerna och sedan sammanfoga dem med någon automat (t.ex. gulp, grunt)?

Vad är det rekommenderade sättet att exponera ditt bibliotek så att både TypeScript-användare och JavaScript-användare kan använda ditt bibliotek?

Hur skulle du skriva tester i TypeScript? Skulle du importera TypeScript-modulerna i dina testfiler?

Svar #1

När du utvecklar ditt bibliotek i TypeScript använder du inte definitioner av dina egna klasser. De är 'självständiga' och ger redan all typinformation till transpiler/IDE. Definitionerna är, som du har nämnt, för externa användare.

Syftet med att sätta declaration till true är att bli av med det tråkiga jobbet att samla typinformation från TypeScript-klasser och klistra in den i definitionsfiler. Som jag har sagt finns denna information redan i TypeScript-filer och kan automatiskt extraheras av transpileraren.

Angående sättet att organisera dina definitioner och exponera dem - jag är säker på att det finns flera olika sätt, en sak är säker - du vill inte skriva samma klassdefinitioner manuellt på två ställen. När det är sagt kan jag ge dig ett exempel på hur jag exponerar ett bibliotekprojekt och använder det i ett annat. Uppmärksamma index.ts-filerna där och hur rotfilen exponeras i package.json -> typings-fältet. Där hittar du också exempel på enhetstester för biblioteket via jasmine.

Hoppas detta kommer ge dig viss information om hur du ska gå tillväga med utvecklingen av ditt bibliotek.