import { EventEmitter } from 'node:events';
type EventsMap = Record<string, (...args: any[]) => void>;
type EventNames<Map extends EventsMap> = keyof Map & (string | symbol);
export type EventParams<Map extends EventsMap, Ev extends EventNames<Map>> = Parameters<Map[Ev]>;
export interface TypedEventBroadcaster<EmitEvents extends EventsMap> {
    emit<Ev extends EventNames<EmitEvents>>(ev: Ev, ...args: EventParams<EmitEvents, Ev>): boolean;
}
export declare abstract class TypedEventEmitter<ListenEvents extends EventsMap, EmitEvents extends EventsMap> extends EventEmitter implements TypedEventBroadcaster<EmitEvents> {
    on<EventName extends EventNames<ListenEvents>>(eventName: EventName, listener: ListenEvents[EventName]): this;
    once<EventName extends EventNames<ListenEvents>>(eventName: EventName, listener: ListenEvents[EventName]): this;
    emit<EventName extends EventNames<EmitEvents>>(eventName: EventName, ...args: EventParams<EmitEvents, EventName>): boolean;
    listeners<EventName extends EventNames<ListenEvents>>(event: EventName): ListenEvents[EventName][];
}
export {};
