import { EventEmitter as NodeEventEmitter } from 'events'; type EventMap = Record; type EventKey = string & keyof T; type EventReceiver = (params: T) => void; interface Emitter { on>(eventName: K, fn: EventReceiver): void; emit>(eventName: K, params: T[K]): void; } export class EventEmitter implements Emitter { private __emitter = new NodeEventEmitter(); on>(eventName: K, fn: EventReceiver) { this.__emitter.on(eventName, fn); } off>(eventName: K, fn: EventReceiver) { this.__emitter.off(eventName, fn); } emit>(eventName: K, params?: T[K]) { this.__emitter.emit(eventName, params); } }