声明在编译时有效,但在运行Mocha测试时无效

时间:2019-05-15 19:42:15

标签: typescript

我有一个简单的声明文件,该文件声明一个模块并将单个类放入该模块:

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

1 个答案:

答案 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' });