import { EventEmitter } from 'events'; import { OverloadedParameters } from './overloaded-parameters'; export type FirstParameter = T extends [infer R, ...any[]] ? R : never; export type EventListener = F extends [ T, infer R, ...any[] ] ? R : never; export type EventParameters< Emitter extends EventEmitter > = OverloadedParameters; export type EventNames = FirstParameter< EventParameters >; export type EventListenerParameters< Emitter extends EventEmitter, Event extends EventNames > = WithDefault< Parameters, Event>>, unknown[] >; export type WithDefault = [T] extends [never] ? D : T; export interface AbortSignal { aborted: boolean; addEventListener: (name: string, listener: (...args: any[]) => any) => void; removeEventListener: ( name: string, listener: (...args: any[]) => any ) => void; }