如何为具有构造函数的外部commonjs模块编写TypeScript声明文件?

时间:2014-10-07 18:34:52

标签: node.js typescript declaration commonjs

请查看更详细的问题:How do I write a TypeScript declaration file for a complex external commonjs module that has constructor, such as imap?

我为Node.js应用编写了TypeScript,我想为javascript模块(可从npm获得)编写一个TypeScript声明文件,该模块在模块级别有一个构造函数。

以下是相关代码的简化版本,文件 a.js

function A(config) {
    this.state = 'constructed';
}
A.prototype.update = function() {
    this.state = 'updated';
};
module.exports = A;

一个简化的javascript应用程序 app.js ,它使用模块 a

var mod = require('a');
var i = new mod({});
console.log('i.state=' + i.state);
i.update();
console.log('i.state=' + i.state);

如何为模块 a.js 编写TypeScript声明文件?

我看过TypeScript Guide for Writing Definition (.d.ts) Files 但不幸的是,我无法弄清楚如何将指南应用于此案例。


已更新为包含接口

这是我的声明文件 a.d.ts

declare module 'a' {
    import events                           = require('events');
    import EventEmitter                     = events.EventEmitter;

    interface Config {
        foo: number;
    }
    interface Other {
        baz: number;
    }

    class A extends EventEmitter {
        state: string;
        constructor(config: Config);
        update(): void;
    }

    var out: typeof A;
    export = out;
}

我无法弄清楚如何使接口可用于我的TypeScript应用程序。 我也希望将它们保留在模块中,以便像Config这样的名称不会与其他模块中的名称发生冲突。


添加了使用此声明的TypeScript应用

我希望 app.ts 看起来像这样:

import mod = require('a');
import Config = mod.Config;
import Other = mod.Other;

var other : Other = {a: 2};
var config : Config = {foo: 2};
var i = new mod(config);
console.log('i.state=' + i.state)
i.update();
console.log('i.state=' + i.state)

2 个答案:

答案 0 :(得分:3)

有几种方法可以做到这一点,这里有一个:

declare class A {
    state: string;
    constructor(config: any);
    update(): void;
}

declare module 'a' {
    var out: typeof A;

    export = out;
}

编辑:如果你想包含接口,但也有一个导出的类,你可以像这样设置它:

declare module A {
    class A {
        state: string;
        constructor();
        update(): void;
    }

    interface B {
        value: any;
    }
}

declare module 'a' {
    var out: typeof A.A;

    export = out;
}

答案 1 :(得分:1)

我找到了一个模块的现有声明文件,其结构与我想要编写声明文件的模块类似:auth0

我现在有一些有用的东西,虽然还不理想。 声明文件 a.d.ts 是:

/// <reference path='node.d.ts' />
interface Config {
    foo: number;
}

declare module 'a' {
    import events                           = require('events');
    import EventEmitter                     = events.EventEmitter;

    class A extends EventEmitter {
        constructor(config : Config);
        state: string;
        update(): void;
    }
    var out: typeof A;
    export = out;
}

使用TypeScript应用文件 app.ts

/// <reference path='a.d.ts' />
import mod = require('a');

var config : Config = {
    foo: 1
} 
var i = new mod(config);
console.log('i.state=' + i.state)
i.update();
console.log('i.state=' + i.state)

a.js 模块与原始问题一样。

我用以下代码编译:{{1​​}}

这当然有效。

虽然我认为在模块外部使用接口(Config)很麻烦,但我还没有弄清楚如何移动接口。