export type EventType = string | symbol; export type Handler> = (evt: { type: E; payload: T[E] }) => void; export type WildcardHandler> = (evt: { type: E; payload: T[E] }) => void; export interface Emitter> { on(type: Key, handler: Handler): void; on(type: '*', handler: WildcardHandler): void; off(type: Key, handler?: Handler): void; off(type: '*', handler: WildcardHandler): void; emit(type: Key, event: Events[Key]): void; emit(type: undefined extends Events[Key] ? Key : never): void; }