Zoeken op website

TypeScript: extern module importeren uit node_modules


Er is bijvoorbeeld een npm-module one-two-three. Het bevat TS-bestanden index.ts (het hoofd) en 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;

compileren :

tsc --module commonjs --declaration index.ts

Bestanden zijn aangemaakt: index.js, index.d.ts, functions.js en functions.d.ts. Oké.

Er is een andere bibliotheek die afhankelijk is van one-two-three.

npm install --save one-two-three

Ik wil afhankelijkheid opnemen en deze gebruiken en de interface van functions.ts.

import mo = require("one-two-three");

Fout Kan externe module 'one-two-three' niet vinden.

/// <reference path="node_modules/one-two-three/index.d.ts" />
import mo = require("one-two-three");

Geen reactie.

import mo = require("./node_modules/one-two-three");

Mislukking.

declare var require;

var mo = require("one-two-three");    

Het compileert succesvol. Maar er is geen typecontrole. Je kunt schrijven: mo.unknownFunction() en het zal worden gecompileerd. Kan geen interfaces gebruiken.

Hoe maak je het hierboven beschreven correct?

BIJWERKEN

Ik heb het gewenste gedrag bereikt zoals volgt. Bewerk d.ts-bestanden.

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;
}

Het gebruiken:

/// <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. Maar we moeten dubbel werk doen. Code schrijven en afzonderlijk de interface beschrijven.

Is er een manier om de juiste d.ts te genereren? Het probleem is dat de d.ts de module moet beschrijven met interne syntaxis (module {}). Maar het bronbestand is een CommonJS-module. Het heeft de sectie module niet.

Antwoord #1

/// <reference path="node_modules/one-two-three/index.d.ts" />
import mo = require("one-two-three");

Geen reactie.

Het zou moeten werken.

Een bestand .d.ts in TypeScript is als een bestand .h in C. Het is normaal om het te gebruiken wanneer een afhankelijkheid wordt geïmporteerd uit een ander project of subproject.

Als het bestand your-project/node_modules/one-two-three/index.d.ts niet correct is geschreven, stel ik voor om het te kopiëren naar your-project/one-two-three.d.ts en vervolgens de kopie te corrigeren. Het gebruik van de modulenaam als bestandsnaam maakt de /// <reference optioneel. Schrijf gewoon:

import mo = require("one-two-three");

Gerelateerde artikelen