TypeScript默认导入失败

时间:2016-03-05 09:05:50

标签: javascript module typescript typescript1.8

我正在尝试设置项目并使用mochamjackson/expect库运行测试以进行断言。我要测试的代码是:

// inside src/lib/math.ts
export function sum(a: number, b: number): number {
  return a + b;
}

我的测试如下:

// inside src/tests/math.tests.ts
/// <reference path="../../typings/main/ambient/mocha/mocha.d.ts" />
/// <reference path="../../typings/main/ambient/expect/expect.d.ts" />

import expect from 'expect';

import {sum} from '../lib/math';

describe('sum', () => {
  it('should add two numbers', () => {
    expect(sum(1, 2)).toEqual(3);
  });
});

我可以使用以下命令使用tsc编译代码:

find src -name *.ts | xargs tsc --declaration --sourceMap --module commonjs --target es5 --listFiles --outDir .

但是,当我使用以下命令从项目目录运行mocha时:

mocha tests

我在测试中看到以下错误:

TypeError: expect_1.default is not a function

当我打开math.tests.ts的编译版本时,我在转换后的代码顶部看到以下行:

var expect_1 = require('expect');

这很好并且符合预期。但是,当我查看调用expect的测试时,我看到以下行:

expect_1.default(math_1.sum(1, 2)).toEqual(3);

现在这行代码似乎错了。 expect库捆绑为ES6模块,expect函数是模块的默认导出。

但是,TypeScript编译器已将代码发送到我的测试中,它尝试访问default上的expect_1属性,该属性是expect库的导入。 expect_1引用本身是我在测试中需要的默认导出函数,而不是expect_1.default无效。

值得注意的是,如果我使用较早的math.tests.ts语法修改了我的expect以导入require。一切正常。

请帮助我理解我所缺少的内容。

P.S。我将TypeScript 1.8.2与Node v4.3.1一起使用。

3 个答案:

答案 0 :(得分:3)

看起来npm包中的expect命名空间类型错误(@types/expect)您可以使用小的解决方法来保存类型检查:

import * as _expect from 'expect';
const expect = _expect as any as typeof _expect.default;

答案 1 :(得分:0)

您的期望包版本似乎与其声明不符。我刚刚安装了一个,发现它有一个default条目:

exports['default'] = expect;
module.exports = exports['default'];

答案 2 :(得分:0)

我遇到了同样的问题并通过更改导入语句来解决

import expect from 'expect';

import * as expect from 'expect';

即获取完整的模块,而不仅仅是默认的导出