From 7e8292a3340a9a6445aaa5ba11eda1ca9e6288d0 Mon Sep 17 00:00:00 2001 From: Damien Lebrun Date: Mon, 4 Dec 2017 17:00:24 +0000 Subject: [PATCH] Emittery generic is an eventName->EventData map --- examples/typed.ts | 15 ++++++++++----- index.d.ts | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/examples/typed.ts b/examples/typed.ts index c4039db..9f100d7 100644 --- a/examples/typed.ts +++ b/examples/typed.ts @@ -1,17 +1,22 @@ import Emittery from '../'; -type EventType = 'value' | 'end' | 'error'; - interface IRecord { msg: string; data?: any[]; ts: number; } +type EventType = { + 'value': IRecord, + 'end': null, + 'error': Error +}; + class Logger extends Emittery { log(msg: string, ...data: any[]) { - this.emit('value', {msg, data, ts: Date.now()}); + this.emit('end', null) + this.emit('value', {msg, data, ts: Date.now()}); console.log(msg, ...data); } } @@ -22,11 +27,11 @@ const logger = new Logger(); logger.log('Logging', 'foo'); logger.log('some more', 'bar', 'baz'); logger.log('finally', 'fooz'); -logger.emitSerial('end'); +logger.emitSerial('end', null); // Register our listeners -const off = logger.on('value', rec => console.log(`data: ${rec.data}, ts: ${rec.ts}`)); +const off = logger.on('value', rec => console.log(`data: ${rec.data}, ts: ${rec.ts}`)); logger.onAny((name: string, data: any) => console.log('Event %d. Called with %d', name, data)); diff --git a/index.d.ts b/index.d.ts index a2628b8..6c47cda 100644 --- a/index.d.ts +++ b/index.d.ts @@ -7,9 +7,9 @@ export default Emittery; /** * Simple and modern async event emitter * - * @template T - An union of literal event name. + * @template T - Map event name to an event data type. */ -declare class Emittery { +declare class Emittery { /** * Subscribe to an event. @@ -19,7 +19,7 @@ declare class Emittery { * * @returns Unsubscribe method. */ - on(eventName: T, listener: (eventData: U) => any): () => void; + on(eventName: K, listener: (eventData?: T[K]) => void | Promise): () => void; /** * Subscribe to an event only once. It will be unsubscribed after the first @@ -27,7 +27,7 @@ declare class Emittery { * * @returns Promise for the event data when eventName is emitted */ - once(eventName: T): Promise; + once(eventName: K): Promise; /** * Unsubscribe to an event. @@ -37,14 +37,14 @@ declare class Emittery { * * @param [listener] */ - off(eventName: T, listener?: (x: any) => any): void; + off(eventName: K, listener?: (eventData?: T[K]) => any): void; /** * Subscribe to be notified about any event. * * @returns A method to unsubscribe */ - onAny(listener: (eventName: T, eventData: any) => any): () => void; + onAny(listener: (eventName: K, eventData?: T[K]) => any): () => void; /** * Unsubscribe an onAny listener. @@ -53,7 +53,7 @@ declare class Emittery { * * @param [listener] */ - offAny(listener?: (eventName: T, eventData: any) => any): void; + offAny(listener?: (eventName: K, eventData?: T[K]) => any): void; /** * Trigger an event asynchronously, optionally with some data. Listeners @@ -68,7 +68,7 @@ declare class Emittery { * * @returns A promise for when all the event listeners are done. */ - emit(eventName: T, eventData?: U): Promise; + emit(eventName: K, eventData?: T[K]): Promise; /** * Same as `emit`, but it waits for each listener to resolve before @@ -80,7 +80,7 @@ declare class Emittery { * * @returns A promise for the last event listener settle or first one rejecting. */ - emitSerial(eventName: T, eventData?: U): Promise; + emitSerial(eventName: K, eventData?: T[K]): Promise; /** * Clear all event listeners on the instance. @@ -93,5 +93,5 @@ declare class Emittery { * @param eventName * @returns Listener count. */ - listenerCount(eventName?: T): number; + listenerCount(eventName?: keyof T): number; }