From c3cf984c436ca9afbe33f782fdaef3dd25e66240 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9rique=20Mittelstaedt?= Date: Mon, 11 May 2020 12:29:10 +0100 Subject: [PATCH 1/2] fix type error on named export --- index.d.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/index.d.ts b/index.d.ts index e813f62..be2fa2a 100644 --- a/index.d.ts +++ b/index.d.ts @@ -119,7 +119,10 @@ declare namespace EventEmitter { } export interface EventEmitterStatic { - new (): EventEmitter; + new < + EventTypes extends ValidEventTypes = string | symbol, + Context = any + >(): EventEmitter; } export const EventEmitter: EventEmitterStatic; From cd071a79259212dacda05ab0063be42ee7c068f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9rique=20Mittelstaedt?= Date: Mon, 11 May 2020 13:27:04 +0100 Subject: [PATCH 2/2] fix type error with directly specified event handler types and export new type helpers --- index.d.ts | 96 +++++++++++++++++++++++++----------------------------- 1 file changed, 44 insertions(+), 52 deletions(-) diff --git a/index.d.ts b/index.d.ts index be2fa2a..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 { @@ -125,6 +91,32 @@ declare namespace EventEmitter { >(): 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; }