我有一个简单的声明文件,该文件声明一个模块并将单个类放入该模块:
declare module 'somemodule' {
export class Thing {
constructor(config: any);
}
}
原始模块是一个内部项目,缺少其自己的声明文件。大致如下:
// index.js
module.exports = require('./src/Thing');
// src/Thing.js
class Thing {
constructor(config) {
// stuff
}
}
module.exports = Thing;
我的项目中有一个使用以下模块的文件:
// src/usething.ts
import { Thing } from 'somemodule';
const thing = new Thing({name:'hi'});
当我运行tsc -p .
时,一切都可以正常编译。
但是,当我尝试运行以下测试时:
mocha -r ts-node/register 'test/**/*-spec.ts'
它失败并显示:
src/usething.ts:8
const thing = new Thing({name:'hi'});
^
TypeError: somemodule_1.Thing is not a constructor
答案 0 :(得分:1)
您具有以下目录结构:
src/
node_modules/
somemodule/
index.js
thing.js
package.json
index.ts
somemodule.d.ts
package.json
module-class.d.ts
模板将为您工作。
// somemodule.d.ts
declare module 'somemodule' {
class Thing {
constructor(config: any);
}
export = Thing;
}
这是一个合适的声明模板,因为您的somemodule/index.js
模块会导出可以用new
构建的内容,并使用CommonJS导出样式。声明模板上有more details here,适用于不同的模块/库结构。
现在有了声明文件,您需要导入模块。这是两种方法。
// index.ts
import Thing = require('somemodule');
const thing = new Thing({ name: 'hi' });
第二个示例要求您的tsconfig.json
文件具有"esModuleInterop": true
。
// index.ts
import Thing from 'somemodule';
const thing = new Thing({ name: 'hi' });