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