У меня проблема с jest, неправильно распознающим объединенные интерфейсы.
У меня есть файл decleration из библиотеки @ types /, установленной с npm. Реализация реализована средой как глобальная в производственной системе, и я не имею к ней доступа (представьте window
как эквивалент браузера, который не определен в вашем коде, но существует, тем не менее, когда js запускается в браузере) .
// @types/Foo/index.d.ts
interface Foo {
A();
}
Затем я добавляю больше функций к этому интерфейсу, используя прототип
// src/monkeypatch.ts
declare global {
interface Foo {
B();
}
}
Foo.prototype.B = function() {};
И использую его в своем коде
// main.ts
import 'src/monkeypatch.ts'; // side effects import
// src/Bar.ts
class Bar {
bar(foo: Foo) {
foo.B();
}
}
Пока что все работает, как и ожидалось, мой редактор доволен, TS c доволен, и все работает просто отлично в производстве.
Теперь я хочу настроить модульные тесты и макет реализации для модульного теста, я создаю реализация.
// mocks/Foo.ts
class FooImpl implements Partial<Foo> {
A() {};
}
export { FooIMpl as Foo };
И тестовый файл
// src/Bar.spec.ts
import { Foo } from '../mocks/Foo';
(global as any).Foo = Foo;
import 'monkeypatch'; // patches A with additional methods
import { Bar } from 'Bar';
new Bar().bar(new Foo());
Но я получаю следующую ошибку, как будто она не знает о том, что слились интерфейсы или что они были исправлены:
Аргумент типа 'FooImpl' нельзя назначить параметру типа 'Foo'. Типу 'FooImpl' не хватает следующих свойств из типа 'Foo': B. ts (2345)
Изменение сайта вызова на bar(new Foo() as any);
- это обходной путь, и тест проходит успешно, но пахнет ужасно, и я хотите, чтобы это работало правильно, чего мне не хватает?
Другая проблема заключается в том, что мне кажется, что я должен использовать Partial, чтобы сделать компилятор счастливым, в противном случае я получаю следующую ошибку: Класс 'FooImpl' неправильно реализует интерфейс ' Foo». Типу 'FooImpl' не хватает следующих свойств из типа 'Foo': B