import EventEmitter from 'events' import { applyMixin } from './shared' export type EventHandler = // Add more overloads as necessary | ((arg1: any, arg2: any, arg3: any, arg4: any) => void) | ((arg1: any, arg2: any, arg3: any) => void) | ((arg1: any, arg2: any) => void) | ((arg1: any) => void) | ((...args: any[]) => void) export interface TypedEventEmitter< TEvents extends Record, > { on( event: TEvent, callback: TEvents[TEvent], ): this once( event: TEvent, callback: TEvents[TEvent], ): this prependListener( event: TEvent, callback: TEvents[TEvent], ): this prependOnceListener( event: TEvent, callback: TEvents[TEvent], ): this removeListener( event: TEvent, callback: TEvents[TEvent], ): this off( event: TEvent, callback: TEvents[TEvent], ): this removeAllListeners(event?: keyof TEvents): this emit( event: TEvent, ...args: Parameters ): boolean setMaxListeners(n: number): this getMaxListeners(): number listeners( eventName: TEvent, ): TEvents[TEvent][] rawListeners( eventName: TEvent, ): TEvents[TEvent][] listenerCount( event: TEvent, listener?: TEvents[TEvent], ): number eventNames(): Array } // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export class TypedEventEmitter< TEvents extends Record, > {} // Make TypedEventEmitter inherit from EventEmitter without actually extending applyMixin(TypedEventEmitter, EventEmitter)