export class EventTarget< // eslint-disable-next-line @typescript-eslint/no-explicit-any EventTypesMap extends Record unknown>, > { private events = new Map< keyof EventTypesMap, EventTypesMap[keyof EventTypesMap][] >(); public dispatchEvent( eventName: K, ...args: Parameters ) { const listeners = this.events.get(eventName); if (!listeners) return; for (const listener of listeners) { listener(...args); } } public getEventDispatcher(eventName: K) { let listeners = this.events.get(eventName); if (!listeners) { listeners = []; this.events.set(eventName, listeners); } const definedListeners = listeners; return (...args: Parameters) => { for (const listener of definedListeners) { listener(...args); } }; } public addEventListener( eventName: K, listener: EventTypesMap[K], ) { const listeners = this.events.get(eventName); if (!listeners) { this.events.set(eventName, [listener]); } else { listeners.push(listener); } } public removeEventListener( eventName: K, listener: EventTypesMap[K], ) { const listeners = this.events.get(eventName); if (listeners) { const index = listeners.indexOf(listener); if (index !== -1) { listeners.splice(index, 1); } } } }