TypeScript默认导入失败

问题描述:

我正在尝试设置项目并使用mochamjackson/expect库进行测试以进行断言。我的代码进行测试是:TypeScript默认导入失败

// 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代码:

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

mocha tests

我看到下面的错误在我的测试:

TypeError: expect_1.default is not a function

当我打开我math.tests.ts的编译版本,我看到了下面一行transpiled代码的顶部:

var expect_1 = require('expect');

这很好,和预期的一样。然而,当我看到了测试,其中expect被称为里面,我看到了下面一行:

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

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

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

需要注意的一点是,如果我修改了我的math.tests.ts以使用旧的require语法导入expect。一切正常。

请帮我理解我错过了什么。

P.S.我使用TypeScript 1.8.2和Node v4.3.1。

+1

对于我'const expect = require('expect');'作品 – tutok

看来你的期望包版本不符合其声明。我刚装了一个,发现它确实有一个default项:

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

是的,我也看到了,但它仍然无法正确导入。我用'babel'尝试了同一个库。它似乎也使用“默认”条目,并且完美地工作。那么有什么可以解决这个问题的? – codematix

+1

Babel处理'default'条目的方式不同,因为我记得如果没有找到'default'条目,它会回退到整个导出的模块。但是你的代码应该和当前版本的'expect'一起工作,试着在JavaScript级别下调试它并找出错误。 – vilicvane

+0

似乎没有任何工作。不知道它是一个Typescript问题还是'expect'库问题。我已经切换到chai.js. – codematix

它看起来像预期的命名空间类型是错误的NPM包(@types/expect)可以使小的变通方法来保存类型检查:

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

嘿,什么是解决方法 – tutok

+0

非常感谢,工作。有人正在对此提出请求吗?看起来github上的最新版本已经从npm install可以节省的内容中改变了。 –