【问题标题】:TypeScript default import failingTypeScript 默认导入失败
【发布时间】:2016-06-19 03:25:35
【问题描述】:

我正在尝试设置一个项目并使用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 编译器已将代码发送到我的测试中,它尝试访问 expect_1 上的 default 属性,这是从 expect 库导入的。 expect_1 引用本身是我在测试中需要的默认导出函数,而不是无效的 expect_1.default

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

请帮助我了解我缺少什么。

附:我使用 TypeScript 1.8.2 和 Node v4.3.1。

【问题讨论】:

  • 对我来说const expect = require('expect'); 工作

标签: javascript module typescript typescript1.8


【解决方案1】:

我有同样的问题,并通过更改导入语句来解决它

import expect from 'expect';

import * as expect from 'expect';

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

【讨论】:

    【解决方案2】:

    看起来 npm 包中的 expect 命名空间类型错误 (@types/expect) 你可以做一些小变通来节省类型检查:

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

    【讨论】:

    • 非常感谢,成功了。有没有人为此提出拉取请求?看起来 github 上的最新版本已经从 npm install 可以保存的内容改变了。
    【解决方案3】:

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

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

    【讨论】:

    • 是的,我也看到了,但它仍然没有正确导入。我用babel 尝试了同一个库。它似乎也使用了default 条目并且工作得很好。那么有什么办法可以解决这个问题呢?
    • Babel 以不同的方式处理 default 条目,因为我记得如果没有找到 default 条目,它将回退到整个导出的模块。但是你的代码应该可以使用当前版本的expect,尝试在 JavaScript 级别下调试它并找出问题所在。
    • 似乎没有任何效果。不确定是 Typescript 问题还是 expect 库问题。我已经切换到 chai.js。
    猜你喜欢
    • 2018-10-14
    • 2022-12-07
    • 2016-07-10
    • 2019-04-03
    • 1970-01-01
    • 2020-04-30
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多