type SupportedEventTarget = Window | Document | HTMLElement | SVGElement | Element | VisualViewport | ShadowRoot | XMLHttpRequest | Performance | Worker | CookieStore | MediaQueryList | EventTarget; type EventMapFor = 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 : Record; type EventTargetListener = (event: E) => void; interface EventTargetBus> { /** subscribe */ on(callback: EventTargetListener[K]>): VoidFunction; /** unsubscribe */ off(callback: EventTargetListener[K]>): void; } declare function createEventTargetBus = keyof EventMapFor>(target: T, eventName: K): EventTargetBus; export { createEventTargetBus }; export type { EventMapFor, EventTargetBus, EventTargetListener, SupportedEventTarget };