@servie/events
Version:
Tiny type-safe event emitter
56 lines (55 loc) • 1.59 kB
TypeScript
/**
* 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;