TypeScript默认导入失败

7

我正在尝试使用mocha和基于mjackson/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 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编译器已经将代码发射到我的测试中,试图访问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'); 是有效的。 - Marcin
3个回答

3

似乎npm包(@types/expect)中的期望命名空间类型错误。您可以进行简单的解决方法以保存类型检查:

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

非常感谢,那个起作用了。有人在处理这个拉取请求吗?看起来github上的最新版本已经与npm install保存的不同了。 - John Lockwood

1

我遇到了同样的问题,通过将导入语句更改为以下内容来解决:

import expect from 'expect';

import * as expect from 'expect';

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

0

看起来你期望的软件包版本与其声明不匹配。我刚刚安装了一个,发现它确实有一个default条目:

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

是的,我也看到了,但它仍然无法正确导入。我尝试使用babel相同的库。它似乎也使用了default条目,并且完美地工作。那么这个问题的解决方案是什么呢? - codematix
1
Babel 处理 default 条目的方式不同,我记得如果没有找到 default 条目,它会回退到整个导出模块。但是你的代码应该可以在当前版本的 expect 中工作,请尝试在 JavaScript 级别下进行调试并找出问题所在。 - vilicvane
似乎什么都不起作用。不确定是Typescript问题还是expect库的问题。我已经切换到chai.js了。 - codematix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接