import { type ExtractEventByType, type ExtractEventTypes } from './events/event-types.js';
import { type TypedEventListenerOrEventListenerObject } from './listener.js';
/**
 * Extract event types from an already-defined `TypedEventTarget` instance or sub-class.
 *
 * @category Internal
 */
export type EventTypesFromEventTarget<EventTargetGeneric extends TypedEventTarget<Event>> = EventTargetGeneric extends TypedEventTarget<infer InferredEventTypeGeneric> ? InferredEventTypeGeneric : never;
/**
 * An EventTarget sub-class with typing for allowed events.
 *
 * @category Main
 */
export declare class TypedEventTarget<const PossibleEvents extends Readonly<Event>> extends EventTarget {
    protected setupListeners: {
        type: string;
        callback: TypedEventListenerOrEventListenerObject<any>;
        options: boolean | EventListenerOptions | undefined;
    }[];
    /**
     * Get a count of all currently attached listeners. If a listener is removed, it will no longer
     * be counted.
     */
    getListenerCount(): number;
    /**
     * Add an event listener. Has the same API as the built-in `EventTarget.addEventListener` method
     * but with added event types.
     */
    addEventListener<const EventType extends ExtractEventTypes<PossibleEvents>>(type: EventType, callback: TypedEventListenerOrEventListenerObject<ExtractEventByType<PossibleEvents, EventType>> | null, options?: boolean | AddEventListenerOptions | undefined): void;
    /**
     * Dispatch a typed event. Has the same API as the built-in `EventTarget.dispatchEvent` method
     * but with added event types.
     */
    dispatchEvent(event: PossibleEvents): boolean;
    /**
     * Remove an already-added event listener. Has the same API as the built-in
     * `EventTarget.removeEventListener` method but with added event types.
     */
    removeEventListener<const EventType extends ExtractEventTypes<PossibleEvents>>(type: EventType, callback: TypedEventListenerOrEventListenerObject<ExtractEventByType<PossibleEvents, EventType>> | null, options?: boolean | EventListenerOptions | undefined): void;
    /** Remove all currently attached event listeners. */
    removeAllEventListeners(): void;
    /** Remove all internal state to free up resources. */
    destroy(): void;
}
