typed-adventureland
Version:
Strong TypeScript declarations for the game AdventureLand
23 lines (22 loc) • 1.89 kB
TypeScript
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>>>;