TypeScript:从node_modules导入外部模块

时间:2015-04-15 14:59:34

标签: typescript

例如,有一个npm模块one-two-three。 它包含TS文件index.ts(主要)和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;

编译:

tsc --module commonjs --declaration index.ts

创建了文件:index.jsindex.d.tsfunctions.jsfunctions.d.ts。 确定。

还有另一个图书馆依赖one-two-three

npm install --save one-two-three

我想要包含依赖并使用它和来自functions.ts的接口。

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

错误Cannot find external module 'one-two-three'

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

没有反应。

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

失败。

declare var require;

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

它成功编译。 但是没有类型检查。 可以写:mo.unknownFunction(),它将被编译。 无法使用接口。

如何正确地进行上述描述?

更新

我已经达到了预期的行为。 编辑d.ts文件。

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

使用它:

/// <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));

成功。 但我们必须做双重责任。 编写代码并单独描述界面。

有没有办法生成正确的d.ts? 问题是d.ts应该用内部语法(module {})描述模块。 但源文件是CommonJS模块。 它没有module部分。

1 个答案:

答案 0 :(得分:4)

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

没有反应。

它应该有用。

TypeScript中的文件.d.ts类似于C中的文件.h。当从其他项目或子项目导入依赖项时,使用它是正常的。

如果文件your-project/node_modules/one-two-three/index.d.ts编写不正确,我建议将其复制到your-project/one-two-three.d.ts,然后修复副本。使用模块名称作为文件名使/// <reference可选。只需写下:

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