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).

  1. 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)?

  2. 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.
  1. 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' eller import {IPoint} från modul 'a'

Inga klumpiga ///<reference= eller handgjorda typings