Skip to content

Instantly share code, notes, and snippets.

@tristanmenzel
Last active October 20, 2022 23:42
Show Gist options
  • Save tristanmenzel/54b74546740023c6106eefe4fe79d980 to your computer and use it in GitHub Desktop.
Save tristanmenzel/54b74546740023c6106eefe4fe79d980 to your computer and use it in GitHub Desktop.
Typed EventEmitter
import { EventEmitter } from 'events'
class TypedEventEmitter<TEvents extends Record<string, any>> {
private emitter = new EventEmitter()
emit<TEventName extends keyof TEvents & string>(eventName: TEventName, ...eventArgs: TEvents[TEventName]) {
this.emitter.emit(eventName, ...eventArgs)
}
on<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArgs: TEvents[TEventName]) => void) {
this.emitter.on(eventName, handler as any)
}
off<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArgs: TEvents[TEventName]) => void) {
this.emitter.off(eventName, handler as any)
}
}
type EventTypes = {
'event-1': []
'event-2': [arg1: number, arg2: string]
}
export const EventBroker = new TypedEventEmitter<LocalEventTypes>()
EventBroker.on('event-1', () => {})
EventBroker.on('event-2', (arg1: number, arg2: string) => {})
EventBroker.emit('event-2', 4, 'test')
EventBroker.emit('event-1')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment