export class EventBus> { private handlers: Map void>> = new Map(); on(event: K, handler: (...args: T[K]) => void): void { let eventHandlers = this.handlers.get(event) as Set<(...args: T[K]) => void> | undefined; if (!eventHandlers) { eventHandlers = new Set<(...args: T[K]) => void>(); this.handlers.set(event, eventHandlers as Set<(...args: T[keyof T]) => void>); } eventHandlers.add(handler); } off(event: K, handler: (...args: T[K]) => void): void { const eventHandlers = this.handlers.get(event) as Set<(...args: T[K]) => void> | undefined; if (!eventHandlers) { return; } eventHandlers.delete(handler); if (eventHandlers.size === 0) { this.handlers.delete(event); } } emit(event: K, ...args: T[K]): void { const eventHandlers = this.handlers.get(event) as Set<(...args: T[K]) => void> | undefined; if (!eventHandlers) { return; } for (const handler of [...eventHandlers]) { handler(...args); } } }