import { Handle } from './util';
export default class Evented<M extends CustomEventTypes = {}, T = EventType, O extends EventObject<T> = EventObject<T>> {
    protected __typeMap__?: M;
    protected listenersMap: Map<T | keyof M, EventedCallback<T, O>[]>;
    private handles;
    constructor();
    emit<K extends keyof M>(event: M[K]): void;
    emit(event: O): void;
    on<K extends keyof M>(type: K, listener: EventedCallbackOrArray<K, M[K]>): Handle;
    on(type: T, listener: EventedCallbackOrArray<T, O>): Handle;
    own(handles: Handle | Handle[]): Handle;
    destroy(): Promise<boolean>;
    private _addListener;
}
export declare type EventedCallback<T = EventType, E extends EventObject<T> = EventObject<T>> = {
    (event: E): boolean | void;
};
export interface CustomEventTypes<T extends EventObject<any> = EventObject<any>> {
    [index: string]: T;
}
export declare type EventedCallbackOrArray<T = EventType, E extends EventObject<T> = EventObject<T>> = EventedCallback<T, E> | EventedCallback<T, E>[];
export declare type EventType = string | symbol;
export interface EventObject<T = EventType> {
    readonly type: T;
}
