UNPKG

@servie/events

Version:

Tiny type-safe event emitter

56 lines (55 loc) 1.59 kB
/** * All events are emitted using this key. */ export declare const ALL_EVENTS: unique symbol; /** * Valid `ALL_EVENTS` listener args. */ export declare type AllEventsArg<T> = { [K in keyof T]: { type: K; args: T[K]; }; }[keyof T]; /** * Internally defined emitter events. */ export interface EmitterEvents<T> { [ALL_EVENTS]: [AllEventsArg<T>]; } /** * All possible events, user provided and built-in. */ export declare type Events<T> = T & EmitterEvents<T>; /** * List of valid event args given `K`. */ export declare type ValidEventArgs<T, K extends keyof Events<T>> = K extends keyof EmitterEvents<T> ? EmitterEvents<T>[K] : K extends keyof T ? ValidArgs<T[K]> : never; /** * Valid event listener args from `T`. */ export declare type ValidArgs<T> = T extends unknown[] ? T : never; /** * Event listener type. */ export declare type EventListener<T, K extends keyof Events<T>> = (...args: ValidEventArgs<T, K>) => void; /** * Wrap `fn` for uniqueness, avoids removing different `fn` in stack. */ export declare type $Wrap<T> = { fn: T; }; /** * Type-safe event emitter. */ export declare class Emitter<T> { $: { [K in keyof Events<T>]: Set<$Wrap<EventListener<T, K>>>; }; on<K extends keyof Events<T>>(type: K, fn: EventListener<T, K>): () => boolean; emit<K extends keyof T>(type: K, ...args: ValidEventArgs<T, K>): void; } /** * Helper to listen to an event once only. */ export declare function once<T, K extends keyof Events<T>>(events: Emitter<T>, type: K, callback: EventListener<T, K>): () => boolean;