Skip to content

Commit a2c6242

Browse files
committed
Merge branch 'develop'
2 parents 09d372b + 6aa9ffb commit a2c6242

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

src/index.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
type Event = string | symbol
1+
type Event = string | number | symbol
2+
type Listener = (...args: any[]) => void
23

3-
export default class EventHub {
4-
private readonly listeners = new Map<Event, Set<{ once: boolean; handler: Function }>>()
4+
5+
export default class EventHub<EventMap extends Record<Event, Listener> = Record<Event, Listener>> {
6+
readonly listeners = new Map<Event, Set<{ once: boolean; handler: Listener }>>()
57

68
constructor() {
79
this.add = this.add.bind(this)
@@ -11,28 +13,32 @@ export default class EventHub {
1113
this.off = this.off.bind(this)
1214
}
1315

14-
private add(event: Event | Event[], handler: Function, once: boolean): void {
16+
add<K extends keyof EventMap>(event: K | K[], handler: EventMap[K], once: boolean): void {
1517
;[event].flat().forEach((event) => {
1618
this.listeners.set(event, this.listeners.get(event)?.add({ once, handler }) ?? new Set([{ once, handler }]))
1719
})
1820
}
1921

20-
on(event: Event | Event[], handler: Function): void {
22+
on<K extends keyof EventMap>(event: K, handler: EventMap[K]): void
23+
on<K extends keyof EventMap>(event: K[], handler: EventMap[K]): void
24+
on<K extends keyof EventMap>(event: K | K[], handler: EventMap[K]): void {
2125
this.add(event, handler, false)
2226
}
2327

24-
once(event: Event, handler: Function): void {
28+
once<K extends keyof EventMap>(event: K, handler: EventMap[K]): void {
2529
this.add(event, handler, true)
2630
}
2731

28-
emit(event: Event, ...args: any[]): void {
32+
emit<K extends keyof EventMap>(event: K, ...args: Parameters<EventMap[K]>): void {
2933
this.listeners.get(event)?.forEach(({ once, handler }) => {
3034
handler(...args)
3135
once && this.listeners.delete(event)
3236
})
3337
}
3438

35-
off(event?: Event | Event[], handler?: Function): void {
39+
off<K extends keyof EventMap>(event?: K, handler?: EventMap[K]): void
40+
off<K extends keyof EventMap>(event?: K[], handler?: EventMap[K]): void
41+
off<K extends keyof EventMap>(event?: K | K[], handler?: EventMap[K]): void {
3642
if (event === undefined) {
3743
this.listeners.clear()
3844
} else {

0 commit comments

Comments
 (0)