type EventArgs = [T] extends [(...args: infer U) => any] ? U : [T] extends [void] ? [] : [T]; 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; listeners(): { [event: string]: ((...args: any[]) => void)[]; }; } export {};