export interface GameEvent {} export interface EventConstructor { new (...args: any[]): T; } export class EventBus { private listeners: Map void>> = new Map(); emit(event: T): void { const eventConstructor = event.constructor as EventConstructor; const callbacks = this.listeners.get(eventConstructor); if (callbacks) { for (const callback of callbacks) { callback(event); } } } on( eventType: EventConstructor, callback: (event: T) => void, ): void { if (!this.listeners.has(eventType)) { this.listeners.set(eventType, []); } const callbacks = this.listeners.get(eventType)!; callbacks.push(callback as (event: GameEvent) => void); } off( eventType: EventConstructor, callback: (event: T) => void, ): void { const callbacks = this.listeners.get(eventType); if (callbacks) { const index = callbacks.indexOf(callback as (event: GameEvent) => void); if (index > -1) { callbacks.splice(index, 1); } } } }