Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 使用TypeScript和EventEmitter键入的事件_Generics_Typescript_Eventemitter - Fatal编程技术网

Generics 使用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

我正在尝试使用TypeScript将强类型事件添加到类似EventEmitter的系统中

目前,我们定义的类型如下:

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

    }
}