export type EventMap = { [key: string]: (...args: any[]) => void; }; /** * Type-safe event emitter. * * Use it like this: * * ```typescript * type MyEvents = { * error: (error: Error) => void; * message: (from: string, content: string) => void; * } * * const myEmitter = new EventEmitter() as TypedEmitter; * * myEmitter.emit("error", "x") // <- Will catch this type error; * ``` */ export interface TypedEventEmitter { addListener(event: E, listener: Events[E]): this; on(event: E, listener: Events[E]): this; once(event: E, listener: Events[E]): this; prependListener(event: E, listener: Events[E]): this; prependOnceListener( event: E, listener: Events[E] ): this; off(event: E, listener: Events[E]): this; removeAllListeners(event?: E): this; removeListener(event: E, listener: Events[E]): this; emit( event: E, ...args: Parameters ): boolean; // The sloppy `eventNames()` return type is to mitigate type incompatibilities - see #5 eventNames(): (keyof Events | string | symbol)[]; rawListeners(event: E): Events[E][]; listeners(event: E): Events[E][]; listenerCount(event: E): number; getMaxListeners(): number; setMaxListeners(maxListeners: number): this; }