diff --git a/index.d.ts b/index.d.ts index e813f62..3b567a8 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,43 +1,9 @@ -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< - EventTypes extends - | string - | symbol - | {} - | { [K in keyof EventTypes]: any[] | ((...args: any[]) => void) } = - | string - | symbol, + EventTypes extends EventEmitter.ValidEventTypes = string | symbol, Context extends any = any > { static prefixed: string | boolean; @@ -46,63 +12,63 @@ declare class EventEmitter< * Return an array listing the events for which the emitter has registered * listeners. */ - eventNames(): Array>; + eventNames(): Array>; /** * Return the listeners registered for a given event. */ - listeners>( + listeners>( event: T - ): Array>; + ): Array>; /** * Return the number of listeners listening to a given event. */ - listenerCount(event: EventNames): number; + listenerCount(event: EventEmitter.EventNames): number; /** * Calls each of the listeners registered for a given event. */ - emit>( + emit>( event: T, - ...args: EventArgs + ...args: EventEmitter.EventArgs ): boolean; /** * Add a listener for a given event. */ - on>( + on>( event: T, - fn: EventListener, + fn: EventEmitter.EventListener | ((...args: any[]) => void), context?: Context ): this; - addListener>( + addListener>( event: T, - fn: EventListener, + fn: EventEmitter.EventListener, context?: Context ): this; /** * Add a one-time listener for a given event. */ - once>( + once>( event: T, - fn: EventListener, + fn: EventEmitter.EventListener | ((...args: any[]) => void), context?: Context ): this; /** * Remove the listeners of a given event. */ - removeListener>( + removeListener>( event: T, - fn?: EventListener, + fn?: EventEmitter.EventListener | ((...args: any[]) => void), context?: Context, once?: boolean ): this; - off>( + off>( event: T, - fn?: EventListener, + fn?: EventEmitter.EventListener | ((...args: any[]) => void), context?: Context, once?: boolean ): this; @@ -110,7 +76,7 @@ declare class EventEmitter< /** * Remove all listeners, or those of the specified event. */ - removeAllListeners(event?: EventNames): this; + removeAllListeners(event?: EventEmitter.EventNames): this; } declare namespace EventEmitter { @@ -119,8 +85,37 @@ declare namespace EventEmitter { } export interface EventEmitterStatic { - new (): EventEmitter; + new < + EventTypes extends ValidEventTypes = string | symbol, + Context = any + >(): EventEmitter; + } + + export type ValidEventTypes = string | symbol | T extends { + [K in keyof T]: any[] | ((...args: any[]) => void); } + ? T + : never; + + export type EventNames = T extends string | symbol + ? T + : keyof T; + + export type EventListener< + T extends ValidEventTypes, + K extends EventNames + > = T extends string | symbol + ? (...args: any[]) => void + : T[K] extends (...args: any[]) => void + ? T[K] + : T[K] extends any[] + ? (...args: T[K]) => void + : (...args: any[]) => void; + + export type EventArgs< + T extends ValidEventTypes, + K extends EventNames + > = Parameters>; export const EventEmitter: EventEmitterStatic; }