import type { IEventEmitter } from './IEventEmitter.js';
export type EventListener = (target: any, data: any) => void;
/**
 * EventEmitter base class
 *
 * @remarks
 * The `eventListeners` map is allocated lazily on the first `on()` call.
 * Many objects (e.g. CoreNodes that never have listeners attached) avoid
 * the cost of allocating an empty `{}` at construction time.
 */
export declare class EventEmitter implements IEventEmitter {
    private eventListeners;
    on(event: string, listener: EventListener): void;
    off(event: string, listener?: EventListener): void;
    once(event: string, listener: EventListener): void;
    emit(event: string, data?: any): void;
    /**
     * Check whether this emitter has any listeners registered.
     *
     * @param event - Optional event name. When provided, checks only that
     * event. When omitted, checks all events.
     * @returns `true` if at least one listener is registered.
     */
    hasListeners(event?: string): boolean;
    removeAllListeners(): void;
    /**
     * Clear all listeners for the given event names by setting their array
     * length to 0, WITHOUT deleting the keys. This keeps the eventListeners
     * object in V8's fast-properties mode and avoids re-allocating the arrays
     * on the next on() call. Use this for objects with a known fixed set of
     * event names (e.g. CoreAnimation, CoreAnimationController).
     *
     * Only writes arr.length = 0 when the array is non-empty -- skips the write
     * (and the write barrier on old-gen objects) when already empty, which is
     * the common case after unregisterAnimation() has removed all listeners.
     */
    clearListeners(events: readonly string[]): void;
}
