【发布时间】:2020-07-30 19:44:47
【问题描述】:
我想知道为什么实现两次相同的泛型接口但使用不同的参数并不能在派生类中强制执行正确的签名。泛型参数的类型被省略。
请看样例:
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 => {
};
}
有没有办法强制执行这两个泛型参数?谢谢!
【问题讨论】:
-
似乎是 TypeScript 编译器中的一个错误。我相信它应该要求
handle输入(event: EmailSentEvent | UserRegisteredEvent): void -
看起来问题更大,并且在检查对象道具的类型兼容性时没有应用严格的函数类型。
const h: IHandle<UserRegisteredEvent> = { handle(e: EmailSentEvent) { e.address.toString() } };将在运行时爆炸。 Playground -
这很奇怪,但是在界面中更改为
handle: (event: T) => void;可以按预期工作。 Try -
@AlekseyL。非常好的观察!
标签: typescript typescript-generics