/**
 * Type-safe event listener and dispatch signatures for the custom events
 * defined in `TDetails`.
 */
export interface CustomEventTarget<TDetails> {
    addEventListener<TType extends keyof TDetails>(type: TType, listener: (ev: CustomEvent<TDetails[TType]>) => any, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<TType extends keyof TDetails>(type: TType, listener: (ev: CustomEvent<TDetails[TType]>) => any, options?: boolean | EventListenerOptions): void;
    dispatchEvent<TType extends keyof TDetails>(ev: _TypedCustomEvent<TDetails, TType>): void;
}
/**
 * Internal declaration for the `typeof` trick below.
 * Never actually implemented.
 */
declare class _TypedCustomEvent<TDetails, TType extends keyof TDetails> extends CustomEvent<TDetails[TType]> {
    constructor(type: TType, eventInitDict: {
        detail: TDetails[TType];
    } & EventInit);
}
/**
 * Typed custom event (technically a typed alias of `CustomEvent`).
 * Use with `CustomEventTarget.dispatchEvent` to infer `detail` types
 * automatically.
 */
export declare const TypedCustomEvent: typeof _TypedCustomEvent;
export declare function createEventTarget<TDetails>(): CustomEventTarget<TDetails>;
export {};
