Typescript - почему реализация интерфейса не форсируется соответственно - PullRequest
4 голосов
/ 17 апреля 2020

Мне интересно, почему реализация дважды одинакового универсального интерфейса c, но с другими параметрами, не обеспечивает правильные сигнатуры в производном классе. Тип параметра generi c опущен.

См. Пример:

interface IEvent { id: number; }
interface IHandle<T> {
  handle(event: T): void;
}

class EmailSentEvent implements IEvent {
  constructor(public id: number, public address: string) {}
}

class UserRegisteredEvent implements IEvent {
  constructor(public id: number) {}
}

class MailHandlerState implements 
  IHandle<EmailSentEvent>, 
  IHandle<UserRegisteredEvent> 
{
  // One implementation is enough to satisfy both interfaces
  handle = (event: EmailSentEvent): void => {

  };
}

Песочница

Есть ли способ обеспечить реализацию обоих параметров c generi? Спасибо!

1 Ответ

3 голосов
/ 17 апреля 2020

TLDR:

Чтобы сделать эту работу, измените метод запись

interface IHandle<T> {
    handle(event: T): void;
}

на свойство с типом функции

interface IHandle<T> {
    handle: (event: T) => void;
}

Детская площадка

** В этом конкретном c варианте реализации все еще можно использовать синтаксис метода


Получается это работает по назначению: режим

--strictFunctionTypes, в котором позиции параметров функционального типа проверяются не в двух измерениях, а в противоположных. Более строгая проверка применяется ко всем типам функций, , кроме тех, которые происходят в объявлениях методов или конструкций . Методы специально исключены, чтобы гарантировать, что обобщенные классы и интерфейсы c (такие как Array) по-прежнему в основном связаны ковариантно. Влияние строгой проверки методов будет гораздо большим разрывным изменением, так как большое количество обобщенных c типов станет инвариантным (даже в этом случае мы можем продолжить исследовать этот более строгий режим)

Источник

Также в справочнике

...