diff --git a/source/event-emitter.ts b/source/event-emitter.ts index e455a08..da22964 100644 --- a/source/event-emitter.ts +++ b/source/event-emitter.ts @@ -2,13 +2,21 @@ export type EventMap = Record; type Listener = (detail: T) => void; +/** + * Internally permits listeners for individual event payloads to be stored + * in a collection typed with the union of all event payloads. + */ +type StoredListener = { + bivarianceHack(detail: Readonly): void; +}['bivarianceHack']; + /** * A listener entry. - * @template T - The event type. + * @template T - The event payload type. */ interface ListenerEntry { - listener: Listener; - wrappedListener: Listener; + listener: StoredListener; + wrappedListener: StoredListener; debounceTime?: number; once?: boolean; } @@ -50,7 +58,7 @@ export class EventEmitter { }; // Add the listener entry to the listeners map. - this.listeners.get(type)?.add(listenerEntry as ListenerEntry); + this.#listeners.get(type)?.add(listenerEntry); // Return an "off" callback that can be called to stop listening for events. return () => this.off(type, listener); @@ -87,7 +95,7 @@ export class EventEmitter { }; // Add the listener entry to the listeners map. - this.listeners.get(type)?.add(listenerEntry as ListenerEntry); + this.#listeners.get(type)?.add(listenerEntry); // Return an "off" callback that can be called to stop listening for events. return () => this.off(type, listener);