TypeScript: importér eksternt modul fra node_modules
Der er for eksempel et npm-modul one-two-three. Det indeholder TS-filerne index.ts (hovedfilen) og functions.ts.
functions.ts:
export interface IPoint {
x: number;
y: number;
}
export function sum(a: IPoint, b: IPoint): IPoint {
return {
x: a.x + b.x,
y: a.y + b.y
};
}
index.ts:
import functions = require("./functions");
export var sum: typeof functions.sum = functions.sum;
kompilere :
tsc --module commonjs --declaration index.ts
Filer er oprettet: index.js, index.d.ts, functions.js og functions.d.ts. Ok.
Der er et andet bibliotek, der er afhængigt af one-two-three.
npm install --save one-two-three
Jeg vil inkludere afhængighed og bruge den samt interfacet fra functions.ts.
import mo = require("one-two-three");
Fejl Kan ikke finde eksternt modul 'one-two-three'.
/// <reference path="node_modules/one-two-three/index.d.ts" />
import mo = require("one-two-three");
Ingen reaktion.
import mo = require("./node_modules/one-two-three");
Fejl.
declare var require;
var mo = require("one-two-three");
Det kompilerer succesfuldt. Men der er ingen typekontrol. Man kan skrive: mo.unknownFunction() og det vil blive kompileret. Man kan ikke bruge interfaces.
Hvordan laver man det ovenfor beskrevne på den korrekte måde?
OPDATERING
Jeg har opnået den ønskede opførsel som følger. Rediger d.ts-filer.
functions.d.ts:
declare module "one-two-three.functions" {
export interface IPoint {
x: number;
y: number;
}
export function sum(a: IPoint, b: IPoint): IPoint;
}
index.d.ts:
/// <reference path="./functions.d.ts" />
declare module "one-two-three" {
import functions = require("one-two-three.functions");
export var sum: typeof functions.sum;
}
Brug af det:
/// <reference path="node_modules/one-two-three/index.d.ts" />
/// <reference path="node_modules/one-two-three/functions.d.ts" />
import oneTwoThree = require("one-two-three");
import functions = require("one-two-three.functions");
import IPoint = functions.IPoint;
function delta(a: IPoint, b: IPoint): number {
var dx: number = a.x - b.x,
dy: number = a.y - b.y;
return Math.sqrt(dx * dx + dy * dy);
}
var point1: IPoint = {x: 10, y: 20},
point2: IPoint = {x: 5, y: 5};
console.log(oneTwoThree.sum(point1, point2));
console.log(delta(point1, point2));
Succes. Men vi er nødt til at påtage os dobbeltarbejde. Skriv kode og beskriv separat grænsefladen.
Findes der en måde at generere den korrekte d.ts på? Problemet er, at d.ts skal beskrive modulet med intern syntaks (module {}). Men kildefilen er et CommonJS-modul. Den har ikke sektionen module.
Svar #1
/// <reference path="node_modules/one-two-three/index.d.ts" />
import mo = require("one-two-three");
Ingen reaktion.
Det burde virke.
En fil .d.ts i TypeScript er som en fil .h i C. Det er normalt at bruge den, når en afhængighed importeres fra et andet projekt eller underprojekt.
Hvis filen your-project/node_modules/one-two-three/index.d.ts ikke er skrevet korrekt, foreslår jeg at kopiere den til your-project/one-two-three.d.ts og derefter rette kopien. At bruge modulnavnet som filnavn gør /// <reference valgfri. Skriv blot:
import mo = require("one-two-three");
