Generics 使用TypeScript和EventEmitter键入的事件
我正在尝试使用TypeScript将强类型事件添加到类似EventEmitter的系统中 目前,我们定义的类型如下:Generics 使用TypeScript和EventEmitter键入的事件,generics,typescript,eventemitter,Generics,Typescript,Eventemitter,我正在尝试使用TypeScript将强类型事件添加到类似EventEmitter的系统中 目前,我们定义的类型如下: interface TypedMsg<Name, T> { messageType: Name; message: T; } type TypedMsgFoo = TypedMsg<'FOO', string>; type TypedMsgBar = TypedMsg<'BAR', number>; type EitherFooOrB
interface TypedMsg<Name, T> {
messageType: Name;
message: T;
}
type TypedMsgFoo = TypedMsg<'FOO', string>;
type TypedMsgBar = TypedMsg<'BAR', number>;
type EitherFooOrBar = TypedMsgFoo | TypedMsgBar;
Typescript确实支持提取成员类型,只是语法有点不寻常——它被称为
接口类型dmsg{
messageType:名称;
信息:T;
}
TypedMsgFoo=TypedMsg;
TypedMsgBar=TypedMsg;
类型EitherFoorBar=类型DMSGFoo |类型DMSGBar;
接口事件处理程序{
on:(messageType:T['messageType'],handler:(m:T['message'])=>void=>void;
}
类FooBarHandler实现EventHandler{
在(
messageType:EitherFooOrBar['messageType'],
处理程序:(m:EitherFooOrBar['message'])=>void
) {
}
}
然而,用显式指定的类型键入所有这些声明将很快变得非常乏味-您需要设计一些允许typescript为您推断类型的东西,例如类似以下问题的东西:应该对您有所帮助。
interface EventHandler<T extends TypedMsg<any, any> {
on: (messageType: T.messageType, handler: (T.message) => void) => void;
}
class FooBarHandler implements EventHandler<EitherFooOrBar> {
on(messageType: EitherFooOrBar.messageType) {...}
}
interface TypedMsg<Name, T> {
messageType: Name;
message: T;
}
type TypedMsgFoo = TypedMsg<'FOO', string>;
type TypedMsgBar = TypedMsg<'BAR', number>;
type EitherFooOrBar = TypedMsgFoo | TypedMsgBar;
interface EventHandler<T extends TypedMsg<{}, {}>> {
on: (messageType: T['messageType'], handler: (m: T['message']) => void) => void;
}
class FooBarHandler implements EventHandler<EitherFooOrBar> {
on(
messageType: EitherFooOrBar['messageType'],
handler: (m: EitherFooOrBar['message']) => void
) {
}
}