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; * ``` */ 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 } export default TypedEventEmitter