export interface TypedEventListener { (evt: E): void; } export interface TypedEventListenerObject { handleEvent(object: E): void; } export type TypedEventListenerOrEventListenerObject = TypedEventListener | TypedEventListenerObject; type StringKeyOf = keyof T extends string ? keyof T : never; export interface TypedEventTarget< EventMap extends Record = Record, K extends string = StringKeyOf > extends EventTarget { addEventListener(type: K, listener: TypedEventListenerOrEventListenerObject|null, options?: boolean|AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject|null, options?: boolean|AddEventListenerOptions): void; removeEventListener(type: K, listener: TypedEventListenerOrEventListenerObject|null, options?: boolean|EventListenerOptions): void; removeEventListener(type: string, listener: EventListenerOrEventListenerObject|null, options?: boolean|EventListenerOptions): void; }; export const TypedEventTarget: { prototype: EventTarget; new< EventMap extends Record = Record, K extends string = StringKeyOf >(): TypedEventTarget; } = EventTarget;