打字稿-为什么不相应地强制执行接口

时间:2020-04-17 10:27:45

标签: typescript typescript-generics

我想知道为什么实现两次相同的通用接口但使用不同的参数不能在派生类中强制执行正确的签名。通用参数的类型被省略。

请参阅示例:

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 => {

  };
}

Sandbox

是否有一种方法可以强制实施两个通用参数?谢谢!

1 个答案:

答案 0 :(得分:3)

TLDR:

要执行此操作,请更改方法表示法

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

更改为具有功能类型的属性

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

Playground

**在这种情况下,实现仍可以使用方法语法


根据预期结果进行这项工作:

--strictFunctionTypes模式,其中函数类型的参数位置是互变量而不是双变量地被检查的。严格的检查适用于所有函数类型,除方法或构造函数声明中的函数以外的所有类型。专门排除了方法,以确保通用类和接口(例如Array)继续保持大多数协变关系。严格检查方法的影响将是一个重大突破,因为大量泛型类型将变为不变(即使如此,我们可能会继续探索这种更严格的模式)

Source

也在handbook

相关问题