// See: https://github.com/facebook/metro/blob/v0.83.2/packages/metro-runtime/src/modules/vendor/eventemitter3.js /** * `object` should be in either of the following forms: * ``` * interface EventTypes { * 'event-with-parameters': any[] * 'event-with-example-handler': (...args: any[]) => void * } * ``` */ export type ValidEventTypes = string | symbol | object; export type EventNames = T extends string | symbol ? T : keyof T; export type ArgumentMap = { [K in keyof T]: T[K] extends (...args: any[]) => void ? Parameters : T[K] extends any[] ? T[K] : any[]; }; export type EventListener> = T extends string | symbol ? (...args: any[]) => void : (...args: ArgumentMap>[Extract]) => void; export type EventArgs> = Parameters>; export class EventEmitter { static prefixed: string | boolean; /** Return an array listing the events for which the emitter has registered listeners. */ eventNames(): Array>; /** Return the listeners registered for a given event. */ listeners>(event: T): Array>; /** Return the number of listeners listening to a given event. */ listenerCount(event: EventNames): number; /** Calls each of the listeners registered for a given event. */ emit>(event: T, ...args: EventArgs): boolean; /** Add a listener for a given event. */ on>(event: T, fn: EventListener, context?: Context): this; addListener>(event: T, fn: EventListener, context?: Context): this; /** Add a one-time listener for a given event. */ once>(event: T, fn: EventListener, context?: Context): this; /** Remove the listeners of a given event. */ removeListener>( event: T, fn?: EventListener, context?: Context, once?: boolean ): this; off>( event: T, fn?: EventListener, context?: Context, once?: boolean ): this; /** Remove all listeners, or those of the specified event. */ removeAllListeners(event?: EventNames): this; } export default EventEmitter;