Ошибка импорта TypeScript по умолчанию

Я пытаюсь настроить проект и запустить тесты с 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 из каталога моего проекта, используя следующую команду:

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.


person codematix    schedule 05.03.2016    source источник
comment
для меня const expect = require('expect'); работает   -  person Marcin    schedule 12.09.2016


Ответы (3)


Похоже, что тип ожидаемого пространства имен неверен в пакете npm (@types/expect ) Вы можете сделать небольшой обходной путь, чтобы сохранить проверку типов:

import * as _expect from 'expect';
const expect = _expect as any as typeof _expect.default;
person Maciej Bukowski    schedule 09.10.2016
comment
Большое спасибо, это сработало. Кто-нибудь работает над запросом на это? Похоже, последняя версия на github уже изменилась по сравнению с тем, что может сохранить npm install. - person John Lockwood; 15.10.2016

Кажется, что ваша ожидаемая версия пакета не соответствует его объявлению. Я только что установил один и обнаружил, что в нем есть запись default:

exports['default'] = expect;
module.exports = exports['default'];
person vilicvane    schedule 06.03.2016
comment
Да, я тоже это видел, но он все еще не импортируется правильно. Я попробовал ту же библиотеку с babel. Кажется, он тоже использует запись default и работает отлично. Итак, что может быть решением этого? - person codematix; 06.03.2016
comment
Babel обрабатывает запись default по-другому, насколько я помню, он возвращался ко всему экспортированному модулю, если запись default не была найдена. Но ваш код должен работать с текущей версией expect, попробуйте отладить его на уровне JavaScript и выяснить, что не так. - person vilicvane; 06.03.2016
comment
Казалось, ничего не работает. Не уверен, что это проблема Typescript или проблема с библиотекой expect. Я перешел на chai.js. - person codematix; 06.03.2016

У меня была такая же проблема, и я исправил ее, изменив оператор импорта с

import expect from 'expect';

to

import * as expect from 'expect';

то есть получить полный модуль, а не только экспорт по умолчанию

person Bertrand L    schedule 11.03.2021