type SupportedEventTarget = Window | Document | HTMLElement | SVGElement | Element | VisualViewport | ShadowRoot | XMLHttpRequest | Performance | Worker | CookieStore | MediaQueryList | EventTarget;
type EventMapFor<T extends SupportedEventTarget> = T extends Window ? WindowEventMap & {
    freeze: Event;
    resume: Event;
    visibilitychange: Event;
} : T extends Document ? DocumentEventMap : T extends HTMLMediaElement ? HTMLMediaElementEventMap : T extends HTMLElement ? HTMLElementEventMap : T extends SVGElement ? SVGElementEventMap : T extends Element ? ElementEventMap : T extends VisualViewport ? VisualViewportEventMap : T extends ShadowRoot ? GlobalEventHandlersEventMap : T extends XMLHttpRequest ? XMLHttpRequestEventMap : T extends Performance ? PerformanceEventMap : T extends Worker ? WorkerEventMap : T extends CookieStore ? CookieStoreEventMap : T extends MediaQueryList ? MediaQueryListEventMap : T extends PermissionStatus ? PermissionStatusEventMap : T extends ScreenOrientation ? ScreenOrientationEventMap : T extends EventTarget ? Record<string, Event> : Record<never, never>;
type EventTargetListener<E = Event> = (event: E) => void;
interface EventTargetBus<T extends SupportedEventTarget, K extends keyof EventMapFor<T>> {
    /** subscribe */
    on(callback: EventTargetListener<EventMapFor<T>[K]>): VoidFunction;
    /** unsubscribe */
    off(callback: EventTargetListener<EventMapFor<T>[K]>): void;
}
declare function createEventTargetBus<T extends SupportedEventTarget = SupportedEventTarget, K extends keyof EventMapFor<T> = keyof EventMapFor<T>>(target: T, eventName: K): EventTargetBus<T, K>;

export { createEventTargetBus };
export type { EventMapFor, EventTargetBus, EventTargetListener, SupportedEventTarget };
