declare type EventArgs = [T] extends [(...args: infer U) => any] ? U : [T] extends [void] ? [] : [T]; /** * Example: * * export interface BaseEvents { * SET_STATE: (component: BaseComponent, state: S) => void; * } */ export interface EventEmitter { addListener( event: EventName, listener: (...args: EventArgs) => void, ): EventEmitter; on( event: EventName, listener: (...args: EventArgs) => void, ): EventEmitter; off( event: EventName, listener: (...args: EventArgs) => void, ): EventEmitter; emit( event: EventName, ...args: EventArgs ): boolean; } export declare class EventEmitter { private callbacks; private init; } export {};