diff --git a/index.d.ts b/index.d.ts index 54e0e45..e813f62 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,11 +1,45 @@ -type EventNames = T extends string | symbol ? T : keyof T; -type EventArgs> = T extends string | symbol ? any[] : K extends keyof T ? T[K] : never; +type ValidEventTypes = string | symbol | T extends { + [K in keyof T]: any[] | ((...args: any[]) => void); +} + ? T + : never; + +type EventNames = T extends string | symbol + ? T + : keyof T; + +type Handler< + T extends any[] | ((...args: any[]) => R), + R = any +> = T extends any[] ? (...args: T) => R : T; + +type EventListener< + T extends ValidEventTypes, + K extends EventNames +> = T extends string | symbol + ? (...args: any[]) => void + : K extends keyof T + ? Handler + : never; + +type EventArgs> = Parameters< + EventListener +>; /** * Minimal `EventEmitter` interface that is molded against the Node.js * `EventEmitter` interface. */ -declare class EventEmitter { +declare class EventEmitter< + EventTypes extends + | string + | symbol + | {} + | { [K in keyof EventTypes]: any[] | ((...args: any[]) => void) } = + | string + | symbol, + Context extends any = any +> { static prefixed: string | boolean; /** @@ -17,7 +51,9 @@ declare class EventEmitter>(event: T): Array>>; + listeners>( + event: T + ): Array>; /** * Return the number of listeners listening to a given event. @@ -27,24 +63,49 @@ declare class EventEmitter>(event: T, ...args: EventArgs): boolean; + emit>( + event: T, + ...args: EventArgs + ): boolean; /** * Add a listener for a given event. */ - on>(event: T, fn: EventEmitter.ListenerFn>, context?: any): this; - addListener>(event: T, fn: EventEmitter.ListenerFn>, context?: any): this; + on>( + event: T, + fn: EventListener, + context?: Context + ): this; + addListener>( + event: T, + fn: EventListener, + context?: Context + ): this; /** * Add a one-time listener for a given event. */ - once>(event: T, fn: EventEmitter.ListenerFn>, context?: any): this; + once>( + event: T, + fn: EventListener, + context?: Context + ): this; /** * Remove the listeners of a given event. */ - removeListener>(event: T, fn?: EventEmitter.ListenerFn>, context?: any, once?: boolean): this; - off>(event: T, fn?: EventEmitter.ListenerFn>, context?: any, once?: boolean): this; + removeListener>( + event: T, + fn?: EventListener, + context?: Context, + once?: boolean + ): this; + off>( + event: T, + fn?: EventListener, + context?: Context, + once?: boolean + ): this; /** * Remove all listeners, or those of the specified event. @@ -58,7 +119,7 @@ declare namespace EventEmitter { } export interface EventEmitterStatic { - new(): EventEmitter; + new (): EventEmitter; } export const EventEmitter: EventEmitterStatic;