UNPKG

typed-adventureland

Version:
23 lines (22 loc) 1.89 kB
export type KeysOfType<Terface, Filter, K extends keyof Terface = keyof Terface> = K extends (Terface[K] extends Filter ? K : never) ? K : never; export type PickMembers<Terface, K extends keyof Terface> = { [P in K]: Terface[P]; }; export type PickMembersOfType<Terface, Filter> = PickMembers<Terface, KeysOfType<Terface, Filter>>; export type PickVoidMembers<Terface> = PickMembersOfType<Terface, void>; export interface TypedEventEmitter<Events, VoidKeys extends KeysOfType<Events, void> = KeysOfType<Events, void>, NotVoidKeys extends Exclude<keyof Events, VoidKeys> = Exclude<keyof Events, VoidKeys>> { on<K extends NotVoidKeys>(eventName: K, callback: (payload: Events[K]) => void): void; on<K extends VoidKeys>(eventName: K, callback: () => void): void; once<K extends NotVoidKeys>(eventName: K, callback: (payload: Events[K]) => void): void; once<K extends VoidKeys>(eventName: K, callback: () => void): void; off<K extends NotVoidKeys>(eventName: K, callback: (payload: Events[K]) => void): void; off<K extends VoidKeys>(eventName: K, callback: () => void): void; /** Removes all listeners for event `eventName` */ off<K extends keyof Events>(eventName: K): void; /** Removes all event listeners */ off(): void; emit<K extends NotVoidKeys>(eventName: K, payload: Events[K]): void; emit<K extends VoidKeys>(eventName: K): void; } export type StrictEventEmitter<Events, EventEmitter> = TypedEventEmitter<Events> & PickMembers<EventEmitter, Exclude<keyof EventEmitter, keyof TypedEventEmitter<Events>>>; export type StrictEventEmitterPicked<Events, EventEmitter, Picked extends keyof TypedEventEmitter<Events>, TEE extends TypedEventEmitter<Events> = TypedEventEmitter<Events>> = PickMembers<TEE, Extract<keyof TEE, Picked>> & PickMembers<EventEmitter, Exclude<keyof EventEmitter, keyof Pick<TEE, Picked>>>;