type EventArgs = [any] | [any?] | []; type EventObjects = Record>; type GetEventObjectTuple = Map[K] extends [ EventEmitter.DataEvent ] ? [data: EventEmitter.DataEvent] : Map[K] extends EventEmitter.DataEvent ? [data: EventEmitter.DataEvent] : [data: EventEmitter.DataEvent]; type ToArgs = IfExtends, never, [ ], IfExtends>; type GetEventDataTuple = ToArgs[0]['data']>; type EventNames = T extends string | symbol ? T : keyof T; type EmitArgs> = EventTypes extends EventObjects ? GetEventDataTuple> : [unknown?]; declare const optionsKey: unique symbol; declare const eventsKey: unique symbol; declare const setOptionsKey: unique symbol; declare const getOptionsKey: unique symbol; export declare class EventEmitter, 'on' | 'once' | 'off' | 'removeAllListeners' | 'emit'> = EventEmitter> { static readonly symbols: { setOptions: symbol; getOptions: symbol; }; private readonly [optionsKey]; private readonly [eventsKey]; constructor(options?: EventEmitter.Options); [getOptionsKey](): EventEmitter.Options; [setOptionsKey](options: Partial): this; getEventListeners(): EventEmitter.EventListeners; getListenerCount>(event?: T): number; on>(event: T, fn: EventEmitter.EventListener, options?: EventEmitter.AddEventListenerOptions): this; once>(event: T, fn: EventEmitter.EventListener): this; off>(event: T, fn?: EventEmitter.EventListener): this; removeAllListeners(event?: EventNames): this; removeAllListenersBut(...events: EventNames[]): this; emit>(event: T, ...args: EmitArgs): boolean; } export declare namespace EventEmitter { export interface DataEvent { type: Type; data: Data; target: Target; } export type EventMap = { [P in keyof Map]: GetEventObjectTuple[0]; }; type Listener = (...args: Args) => void; export type EventListener, Target> = EventTypes extends EventObjects ? Listener<[event: EventMap[Extract]]> : Listener<[event: EventEmitter.DataEvent]>; export type EventListeners = { [P in EventNames]: EventListener[]; }; export interface Options { /** Defaults to `true`. */ readonly ignoreListenerError?: boolean | undefined; } export interface AddEventListenerOptions { readonly once?: boolean | undefined; } export {}; } export {};