import { Event } from "./Event.js";
import { EventListener } from "./EventListener.js";
import { EventListenerObject } from "./EventListenerObject.js";
/**
 * An event target that can dispatch events to registered listeners.
 */
export declare class EventTarget<TEventMap extends object = object> {
    /**
     * A collection of event listener functions.
     */
    protected readonly listenerFunctions: Map<string, Set<EventListener<TEventMap[keyof TEventMap], string, this>>>;
    /**
     * A collection of event listener objects.
     */
    protected readonly listenerObjects: Map<string, Set<EventListenerObject<TEventMap[keyof TEventMap], string, this>>>;
    /**
     * Constructs a new event target.
     */
    constructor();
    /**
     * Registers an event handler of a specific event type on the event target.
     *
     * @param type - The event type to listen for.
     * @param listener - An event listener or callback.
     */
    addEventListener<T extends Extract<keyof TEventMap, string>>(type: T, listener: EventListener<TEventMap[T], T, this> | EventListenerObject<TEventMap[T], T, this>): void;
    /**
     * Removes an event handler of a specific event type from the event target.
     *
     * @param type - The event type to remove.
     * @param listener - The event listener to remove.
     */
    hasEventListener<T extends Extract<keyof TEventMap, string>>(type: T, listener: EventListener<TEventMap[T], T, this> | EventListenerObject<TEventMap[T], T, this>): boolean;
    /**
     * Removes an event handler of a specific event type from the event target.
     *
     * @param type - The event type to remove.
     * @param listener - The event listener to remove.
     */
    removeEventListener<T extends Extract<keyof TEventMap, string>>(type: T, listener: EventListener<TEventMap[T], T, this> | EventListenerObject<TEventMap[T], T, this>): void;
    /**
     * Dispatches an event at the specified event target, invoking the affected event listeners in the appropriate order.
     *
     * Event listeners can safely be added and removed while an event is being dispatched.
     *
     * @see https://262.ecma-international.org/#sec-map.prototype.foreach for more information on the iteration behavior.
     * @param event - The event to dispatch.
     * @param target - An event target.
     */
    dispatchEvent<T extends Extract<keyof TEventMap, string>>(event: Event<T> & TEventMap[T], target?: EventTarget<TEventMap>): void;
    /**
     * Removes all listeners.
     */
    clearEventListeners(): void;
}
