import type { LatLng } from './lat-lng';
/**
 * ## 事件机制对比
 * - DOM: add/removeEventListener, Event {type, target}
 * - Vue: $on/$off, 没有Event, listener直接接收数据
 * - baidu: 模仿DOM
 * - here: 模仿DOM
 * - google: addListener+remove, 没有Event, listener直接接收数据
 *
 * 综合对比之后, 决定模仿DOM的事件机制
 */
export declare namespace Tg {
    interface Event {
        type: string;
        target: EventTarget;
        originalEvent?: any;
    }
    interface MouseEvent extends Event {
        position: LatLng;
    }
    interface EventListener {
        (this: EventTarget, event: Event): void;
        /** 唯一id */
        __id__?: number;
    }
    interface EventTarget {
        addEventListener(type: string, listener: EventListener): void;
        removeEventListener(type: string, listener: EventListener): void;
    }
    /**
     * 拥有更详细的类型信息
     * @see EventTarget
     * */
    interface EventTargetTyped<THIS extends EventTarget, MAP extends {
        [k: string]: Event;
    }> extends EventTarget {
        addEventListener<K extends keyof MAP>(type: K, listener: (this: THIS, event: MAP[K]) => void): void;
        removeEventListener<K extends keyof MAP>(type: K, listener: (this: THIS, event: MAP[K]) => void): void;
    }
}
export declare function bindEvents(listeners: Record<string, unknown>, target: Tg.EventTarget, excludes?: string[]): void;
export declare function generateNextEventListenerId(): number;
/**
 * JS的Map/object的key都不支持自定义hashCode()/equals(), 故只能生成字符串当作key
 */
export declare function generateEventKey(type: string, listener: Tg.EventListener): string;
