export interface EventDefinitions { [key: string]: EventListener; } // export type EventKeys = keyof T; // export type EventKeys = (keyof T) & ({ // [key in keyof T]: string extends key ? never : number extends key ? never : key; // } extends { [_ in keyof T]: infer U } ? U : never); export type EventKeys = keyof T;// { [key in keyof T]: T[key] extends (...args: any[]) => any ? T[key] : never }; export type EventListener = (...args: any[]) => void; export interface IEventSource { on>(event: T, listener: TEvents[T]): void; off>(event: T, listener: TEvents[T]): void; } export class EventEmitter any}> implements IEventSource { listeners = new Map(); // on(event: string, listener: EventListener): void // on>(event: T, listener: TEvents[T]): void on>(event: T, listener: TEvents[T]) { if (!this.listeners.has(event)) this.listeners.set(event, []); this.listeners.get(event)?.push(listener); } // off(event: string, listener: EventListener): void // off>(event: T, listener: TEvents[T]): void off>(event: T, listener: TEvents[T]) { if (this.listeners.has(event)) this.listeners.set(event, this.listeners.get(event)?.filter(f => f !== listener) ?? []); } // emit(event: string, ...args: any[]): void // emit>(event: T, ...args: Parameters): void emit>(event: T, ...args: Parameters) { this.listeners.get(event)?.forEach(f => f(...args)); } with(): EventEmitter { return this as any; } }