Я пытаюсь добавить строго типизированные события в систему, подобную EventEmitter, используя TypeScript.
В настоящее время мы определяем наши типы следующим образом:
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<any, any> {
on: (messageType: T.messageType, handler: (T.message) => void) => void;
}
Но Typescript не поддерживает извлечение подтипов, таких как T.messageType
. Есть ли другой способ сделать это?
Конечная цель состояла бы в том, чтобы определить обработчики с правильной типизацией, просто:
class FooBarHandler implements EventHandler<EitherFooOrBar> {
on(messageType: EitherFooOrBar.messageType) {...}
}