import { EventEmitter2 as EventEmitter } from 'eventemitter2'; /** * Typed Event Emitter Reference: * https://rjzaworski.com/2019/10/event-emitters-in-typescript#a-typescript-event-emitter-interface */ export type EventMap = Record; export type EventKey = string & keyof T; export type EventReceiver = (params: T) => void; // interface Emitter { // on>(eventName: K, fn: EventReceiver): void; // off>(eventName: K, fn: EventReceiver): void; // emit>(eventName: K, params: T[K]): void; // } export abstract class TypedEventEmitter extends EventEmitter { on>(eventName: K, fn: EventReceiver) { return super.on(eventName, fn); } off>(eventName: K, fn: EventReceiver) { return super.off(eventName, fn); } emit>(eventName: K, params: T[K]) { return super.emit(eventName, params); } listeners>(eventName: K): EventReceiver[] { return super.listeners(eventName) as EventReceiver[]; } }