export type EventMap<T> = Record<keyof T, any[]> | DefaultEventMap;
type DefaultEventMap = [never];
type Args<K, T> = T extends DefaultEventMap ? [...args: any[]] : K extends keyof T ? T[K] : never;
type EventName<K, T> = T extends DefaultEventMap ? string | symbol | number : K | keyof T;
type Listener<K, T> = T extends DefaultEventMap ? (...args: any[]) => void : K extends keyof T ? T[K] extends unknown[] ? (...args: T[K]) => void : never : never;
export type ExtractEventMap<T> = T extends Emitter<infer U> ? U : never;
export default class Emitter<T extends EventMap<T>> {
    private listeners;
    private onces;
    on<K>(eventName: EventName<K, T>, listener: Listener<K, T>): this;
    once<K>(eventName: EventName<K, T>, listener: Listener<K, T>): this;
    off<K>(eventName: EventName<K, T>, listener: Listener<K, T>): this;
    emit<K>(eventName: EventName<K, T>, ...args: Args<K, T>): boolean;
    clear<K>(eventName: EventName<K, T>, ...args: Args<K, T>): this;
}
export {};
//# sourceMappingURL=index.d.ts.map