Прототип Typescript и шутка - PullRequest
       7

Прототип Typescript и шутка

0 голосов
/ 25 апреля 2020

У меня проблема с 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

1 Ответ

0 голосов
/ 25 апреля 2020

Похоже, исправление распознается , но ваш FooImpl просто определяет A(){}, а не B(){}, как вы сами заявили в src/monkeypatch.ts.

После увеличения Foo становится

class Foo {
  A() {}
  B() {}
}

Таким образом, чтобы присвоить FooImpl Foo, вы должны реализовать оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...