type EventMap = Record<string, (...args: any[]) => void>;
type TListener<M extends EventMap, K extends keyof M> = M[K];
type TPayLoad<M extends EventMap, K extends keyof M> = Parameters<TListener<M, K>>;
declare abstract class Emitter<T extends EventMap> {
    listener: Partial<Record<keyof T, TListener<T, keyof T>[]>>;
    on<E extends keyof T>(event: E, listener: TListener<T, E>): () => void;
    once<E extends keyof T>(event: E, listener: TListener<T, E>): () => void;
    dispatch<E extends keyof T>(event: E, ...payload: TPayLoad<T, E>): void;
    removeAllListeners(): void;
}

export { Emitter, type EventMap, type TListener, type TPayLoad };
