Files
event-emitter/event-emitter.ts
2024-06-30 14:06:20 +02:00

40 lines
1.2 KiB
TypeScript

import { EventEmitter as BaseEventEmitter } from "eventemitter3";
export class EventEmitter<EventTypes extends ValidEventTypes = string | symbol> extends BaseEventEmitter<EventTypes> {
subscribe<T extends EventNames<EventTypes>>(
event: T,
fn: EventListener<EventTypes, T>,
destroy?: () => void,
): {
unsubscribe: () => void;
} {
this.addListener(event, fn);
return {
unsubscribe: () => {
this.removeListener(event, fn);
if (destroy) {
destroy();
}
},
};
}
}
/*
|--------------------------------------------------------------------------------
| Types
|--------------------------------------------------------------------------------
*/
type EventListener<T extends ValidEventTypes, K extends EventNames<T>> = T extends string | symbol
? (...args: any[]) => void
: (...args: ArgumentMap<Exclude<T, string | symbol>>[Extract<K, keyof T>]) => void;
type EventNames<T extends ValidEventTypes> = T extends string | symbol ? T : keyof T;
type ValidEventTypes = string | symbol | Record<string, unknown>;
type ArgumentMap<T extends Record<string, unknown>> = {
[K in keyof T]: T[K] extends (...args: any[]) => void ? Parameters<T[K]> : T[K] extends any[] ? T[K] : any[];
};