forked from JeremyHeleine/Photo-Sphere-Viewer
-
-
Notifications
You must be signed in to change notification settings - Fork 634
/
TypedEventTarget.ts
48 lines (43 loc) · 1.53 KB
/
TypedEventTarget.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
* Base class for events dispatched by {@link TypedEventTarget}
* @template TTarget type of the event target
*/
export abstract class TypedEvent<TTarget extends TypedEventTarget<any>> extends Event {
static readonly type: string;
override target: TTarget;
constructor(type: string, cancelable = false) {
super(type, { cancelable });
}
}
/**
* Decorator for EventTarget allowing to strongly type events and listeners
* @link https://rjzaworski.com/2021/06/event-target-with-typescript
* @template TEvents union of dispatched events
*/
export class TypedEventTarget<TEvents extends TypedEvent<any>> extends EventTarget {
override dispatchEvent(e: TEvents): boolean {
return super.dispatchEvent(e);
}
/**
* @template T the name of event
* @template E the class of the event
*/
override addEventListener<T extends TEvents['type'], E extends TEvents & { type: T }>(
type: T,
callback: ((e: E) => void) | EventListenerObject | null,
options?: AddEventListenerOptions | boolean
) {
super.addEventListener(type, callback as any, options);
}
/**
* @template T the name of event
* @template E the class of the event
*/
override removeEventListener<T extends TEvents['type'], E extends TEvents & { type: T }>(
type: TEvents['type'],
callback: ((e: E) => void) | EventListenerObject | null,
options?: EventListenerOptions | boolean
) {
super.removeEventListener(type, callback as any, options);
}
}