如何为具有构造函数的外部commonjs模块编写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; 

和一个简化的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的写作定义(.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; } 

我无法弄清楚如何使我的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) 

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

 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 AA; export = out; } 

我发现了一个模块的现有声明文件,这个模块与我想写一个声明文件的结构类似:auth0

  • 在npm上的auth0
  • auth0.d.ts

我现在有一些工作,虽然还不理想。 声明文件adts是:

 /// <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='adts' /> 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模块是在原来的问题。

我编译这个: tsc --module commonjs app.ts

这当然适用。

虽然我觉得在模块之外有接口(Config)是很麻烦的,但是我还没有想出如何移动内部的接口。

Interesting Posts