diff --git a/index.d.ts b/index.d.ts index 6b0f0b4..152c0ee 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,44 +1,59 @@ export type Arguments = [T] extends [(...args: infer U) => any] - ? U - : [T] extends [void] ? [] : [T] + ? U + : [T] extends [void] + ? [] + : [T]; + +export type EventFunction = (...args: any[]) => void; +export type EmitterEvents = EmitterEvent; +export type EmitterEvent = { + name: Name; + args: Arguments; +}; /** * Type-safe event emitter. * * Use it like this: * - * interface MyEvents { - * error: (error: Error) => void - * message: (from: string, content: string) => void - * } + * type DynamicEvents = + * | EmitterEvent<'ping', () => void> + * | EmitterEvent<'message', (from: string, content: string) => void> + * | EmmiterEvents<'error': (error: Error) => void> + * | EmitterEvent<`foo:${string}`, (size: number, strict: boolean) => void> + * | EmitterEvent<`bar:${string}`, (force: boolean) => void>; * - * const myEmitter = new EventEmitter() as TypedEmitter + * const myEmitter = new EventEmitter() as TypedEmitter * * myEmitter.on("message", (from, content) => { * // ... * }) * * myEmitter.emit("error", "x") // <- Will catch this type error + * + * myEmitter.emit("foo:1", 2, false) // dynamic/variable event names work + * myEmitter.emit(`foo:${'456'}`, 2, false) + * */ -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 +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 + off(event: E, listener: Events[E]): this; + removeAllListeners(event?: E): this; + removeListener(event: E, listener: Events[E]): this; - emit (event: E, ...args: Arguments): boolean - eventNames (): (keyof Events | string | symbol)[] - rawListeners (event: E): Function[] - listeners (event: E): Function[] - listenerCount (event: E): number + emit(name: E['name'], ...args: E['args']): boolean; + eventNames(): (keyof Events | string | symbol)[]; + rawListeners(event: E): Function[]; + listeners(event: E): Function[]; + listenerCount(event: E): number; - getMaxListeners (): number - setMaxListeners (maxListeners: number): this + getMaxListeners(): number; + setMaxListeners(maxListeners: number): this; } -export default TypedEventEmitter +export default TypedEventEmitter; diff --git a/package.json b/package.json index d39734e..f1afd23 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typed-emitter", - "version": "1.3.1", + "version": "1.3.4", "license": "MIT", "description": "Strictly typed event emitter interface for TypeScript 3.", "author": "Andy Wermke (https://github.com/andywer)",