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

psn*_*der 5 declaration commonjs node.js typescript

请参阅更多详细问题:如何为具有imap等构造函数的复杂外部commonjs模块编写TypeScript声明文件?

我为Node.js应用程序编写TypeScript,并且我想为在模块级别具有构造函数的javascript模块(可从npm获取)编写TypeScript声明文件。

这是文件a.js中相关代码的简化版本:

function A(config) {
    this.state = 'constructed';
}
A.prototype.update = function() {
    this.state = 'updated';
};
module.exports = A;
Run Code Online (Sandbox Code Playgroud)

和一个简化的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);
Run Code Online (Sandbox Code Playgroud)

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

我已阅读《TypeScript书写定义(.d.ts)文件指南》, 但不幸的是,我无法弄清楚如何将指南应用于这种情况。


更新为包括接口

这是我的声明文件adts

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;
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何使接口可用于我的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)
Run Code Online (Sandbox Code Playgroud)

wjo*_*sto 3

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

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

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

    export = out;
}
Run Code Online (Sandbox Code Playgroud)

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

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

    interface B {
        value: any;
    }
}

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

    export = out;
}
Run Code Online (Sandbox Code Playgroud)