export type TypedEvent = Omit, 'detail' | 'type'> & { type: TType; detail: TDetail; }; export interface TypedEventListener { (evt: TEvent): void; } export interface TypedEventListenerObject { handleEvent(object: TEvent): void; } export type TypedEventListenerOrEventListenerObject = TypedEventListener | TypedEventListenerObject; export interface TypedEventTarget extends EventTarget { addEventListener(type: TCurrEvent['type'], callback: TypedEventListenerOrEventListenerObject | null, options?: AddEventListenerOptions | boolean): void; dispatchEvent(event: TEvent): boolean; removeEventListener(type: TCurrEvent['type'], callback: TypedEventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void; }