Typescript, deklaration och CommonJS
Jag är förvirrad när jag skapar deklarationsfiler (d.ts).
Till exempel skapade jag ett NPM-paket "a" (en CommonJS-modul index.ts):
export interface IPoint {
x: number;
y: number;
}
export default function sub(one: IPoint, two: IPoint): IPoint {
return {
x: one.x - two.x,
y: one.y - two.y
};
}
Kompilera det och generera en .d.ts:
export interface IPoint {
x: number;
y: number;
}
export default function sub(one: IPoint, two: IPoint): IPoint;
Som jag förstår kan kompilatorn inte generera giltiga d.ts för CommonJS. Man måste använda verktyg som dts-generator eller göra omslag manuellt:
declare module "a"
{
export interface IPoint {
x: number;
y: number;
}
export default function sub(one: IPoint, two: IPoint): IPoint;
}
Okej. Nu gör jag paketet "b" (som beror på "a"):
/// <reference path="node_modules/a/a.d.ts" />
import sub from "a"
import { IPoint } from "a"
export { IPoint }
export default function distance(one: IPoint, two: IPoint): number {
var s = sub(one, two);
return Math.sqrt(s.x * s.x + s.y * s.y);
}
Okej, det fungerar. Nu vill jag ha ett paket "c" som är beroende av "b" (och så vidare).
Hur specificerar man beroendet i modulen "b" (länk till "a.d.ts")? Försöker man specificera i "node_modules"? Eller kopiera "a.d.ts" till katalogen "/typings/" i paketet "b"? Och sedan kopiera "a.d.ts" och "b.d.ts" till "/typings/" i paketet "c" (och så vidare)?
Vad är poängen med avsnitten "typings" i "package.json"? Jag skriver i "b/package.json":
"typings": "./b.d.ts"
Och får felet när man kompilerar "c":
Exported external package typings file 'node_modules/b/b.d.ts' is not a module.
- Hur man skapar d.ts-filer för CommonJS-modul? Så att man inte behöver skriva manuellt "declare module", "reference" och liknande.
Svar #1
Som jag förstår kan kompilatorn inte generera giltiga d.ts för CommonJS. Måste använda verktyg som dts-generator eller att manuellt paketera:
Faktiskt nej (sedan 1.6).
Kompilera helt enkelt modul a genom att passera declaration-flaggan till tsc. Transpilatorn kommer att generera deklarationsfilerna åt dig.
Du har rätt att dessa filer inte är externa definitionsfiler, utan interna definitionsfiler
dock
Modul b kommer att kunna automatiskt hitta och använda dessa filer om, i package.json för modul a, typings-posten pekar på den genererade filen index.d.ts
Sammanfattningsvis:
Modul a:
- kompilera med
declaration-flaggan - uppdatera
typings-posten för att peka på den genererade.d.ts-filen
Modul b:
- enkelt
import * as moduleA från 'a'ellerimport {IPoint} från modul 'a'
Inga klumpiga ///<reference= eller handgjorda typings