我正在使用 TypeScript 创建一个 EventEmitter,但是我无法找到以下操作的解决方法:
假设我有这样一个接口:
interface EventEmitterSubscription { dispose(): void }
// here it is
interface EventEmitter<T extends { [key: string]: any }> {
onAnyEvent(callback: (event: { type: ???, payload: ??? }) => void): EventEmitterSubscription
// ...
}
我找不到一种方法来输入onAnyEvent
回调函数,例如对于这样的事件发射器:
EventEmitter<{ onNumberReceived: number, onCatReceived: { cat: ICat }, onPersonNameReceived: string }>
onAnyEvent
字段应该是这种类型:
onAnyEvent(callback: (event: { type: 'onNumberReceived', payload: number } | { type: 'onCatReceived', payload: { cat: ICat } } | { type: 'onPersonNameReceived', payload: string }) => void): EventEmitterSubscription
目前我的实现看起来像这样:
onAnyEvent(callback: (event: { type: keyof T, payload: T[keyof T] }) => void): EventEmitterSubscription
除了目前不起作用,例如这将产生类型 onAnyEvent(callback: (event: { type: 'onNumberReceived', payload: number } | {
type: 'onNumberReceived', payload: { cat: ICat } } | /* ... */) => void): EventEmitterSubscription
那么我该如何为onAnyEvent
字段编写类型呢?