我想知道为什么实现同一个泛型接口,但使用不同的参数时,在派生类中没有强制正确的签名。泛型参数的类型被省略了。
请查看示例:
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 => {
};
}
有办法强制实现两个泛型参数吗?谢谢!
handle
的类型为(event: EmailSentEvent | UserRegisteredEvent): void
。 - emlaiconst h: IHandle<UserRegisteredEvent> = { handle(e: EmailSentEvent) { e.address.toString() } };
将在运行时崩溃。Playground - Aleksey L.handle: (event: T) => void;
可以按预期工作。试一下 - Aleksey L.