export type Listener = (event: K) => void; export class EventManager { private listenerMap: Map void>>; public constructor() { this.listenerMap = new Map(); } public on(eventName: keyof K, listener: Listener) { let listenerList: Listener[] = []; if (this.listenerMap.has(eventName)) { listenerList = this.listenerMap.get(eventName) as Array<(event: V) => void>; } listenerList.push(listener); this.listenerMap.set(eventName, listenerList); } public off(eventName: keyof K, listener?: Listener): boolean { if (!this.listenerMap.has(eventName)) return false; const listenerList: Listener[] = this.listenerMap.get(eventName) as Listener[]; if (listenerList.length === 0) return false; if (!listener) { this.listenerMap.delete(eventName); return true; } const index = listenerList.indexOf(listener); if (index === -1) return false; listenerList.splice(index, 1); return true; } public emit(eventName: keyof K, event: V): boolean { if (!this.listenerMap.has(eventName)) return false; const listenerList: Listener[] = this.listenerMap.get(eventName) as Listener[]; if (listenerList.length === 0) return false; listenerList.forEach((listener: Listener) => listener(event)); return true; } }