Skip to content

Instantly share code, notes, and snippets.

@guiseek
Created August 7, 2023 06:45
Show Gist options
  • Save guiseek/d89918aeb5d77c596fcf8c7e322bce3c to your computer and use it in GitHub Desktop.
Save guiseek/d89918aeb5d77c596fcf8c7e322bce3c to your computer and use it in GitHub Desktop.
Observe Event
type DOMEventMapDefinitions = [
[HTMLElement, HTMLElementEventMap],
[Document, DocumentEventMap],
[Window, WindowEventMap],
[FileReader, FileReaderEventMap],
[Element, ElementEventMap],
[Animation, AnimationEventMap],
[EventSource, EventSourceEventMap],
[AbortSignal, AbortSignalEventMap],
[AbstractWorker, AbstractWorkerEventMap],
[MediaQueryList, MediaQueryListEventMap]
// ...
];
export type { DOMEventMapDefinitions }
import type { DOMEventMapDefinitions } from './dom-event-map-definitions';
type DOMEventSubscriber = DOMEventMapDefinitions[number][0];
export type { DOMEventSubscriber }
import type { DOMEventMapDefinitions } from './dom-event-map-definitions';
import type { DOMEventSubscriber } from './dom-event-subscriber';
type GetDOMEventMaps<T extends DOMEventSubscriber> = MapDefinitionToEventMap<
DOMEventMapDefinitions,
T
>;
export type { GetDOMEventMaps }
type MapDefinitionToEventMap<D extends { [K: number]: any[] }, T> = {
[K in keyof D]: D[K] extends any[]
? T extends D[K][0]
? D[K][1]
: never
: never;
};
export type { MapDefinitionToEventMap }
type MapEventMapsToEvent<
D extends { [K: number]: any },
T extends PropertyKey
> = {
[K in keyof D]: D[K] extends never
? never
: T extends keyof D[K]
? D[K][T]
: never;
};
type MapEventMapsToKeys<D extends { [K: number]: any }> = {
[K in keyof D]: D[K] extends never ? never : keyof D[K];
};
export type { MapEventMapsToKeys }
import type { DOMEventSubscriber } from './dom-event-subscriber';
import type { MapEventMapsToKeys } from './map-event-maps-to-keys';
import type { GetDOMEventMaps } from './get-dom-event-maps';
import type { MapEventMapsToEvent } from './map-event-maps-to-event';
import { fromEvent, map } from 'rxjs';
export function observeEvent<
T extends DOMEventSubscriber,
K extends MapEventMapsToKeys<GetDOMEventMaps<T>>[number] & string
>(
element: T,
type: K,
handler: (
this: T,
ev: MapEventMapsToEvent<GetDOMEventMaps<T>, K>[number]
) => any
) {
return fromEvent<MapEventMapsToEvent<GetDOMEventMaps<T>, K>[number]>(
element,
type
).pipe(map(handler));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment