Skip to content

Instantly share code, notes, and snippets.

@andywer
Last active September 26, 2018 17:14
Show Gist options
  • Save andywer/672580d0ec11f8eb4b4011ecc01b08eb to your computer and use it in GitHub Desktop.
Save andywer/672580d0ec11f8eb4b4011ecc01b08eb to your computer and use it in GitHub Desktop.
Type-safe EventEmitter
type Arguments<T> = [T] extends [(...args: infer U) => any]
? U
: [T] extends [void] ? [] : [T]
/**
* Type-safe event emitter.
*
* Use it as:
*
* interface MyEvents {
* error: (error: Error) => void
* message: (from: string, content: string) => void
* }
*
* const myEmitter = new EventEmitter() as TypedEmitter<MyEvents>
*
* myEmitter.on("message", (from, content) => {
* // ...
* })
*
* myEmitter.emit("error", "x") // <- Will catch this type error
*/
export interface TypedEventEmitter<Events> {
addListener<E extends keyof Events> (event: E, listener: Events[E]): this
on<E extends keyof Events> (event: E, listener: Events[E]): this
once<E extends keyof Events> (event: E, listener: Events[E]): this
prependListener<E extends keyof Events> (event: E, listener: Events[E]): this
prependOnceListener<E extends keyof Events> (event: E, listener: Events[E]): this
removeAllListeners<E extends keyof Events> (event: E): this
removeListener<E extends keyof Events> (event: E, listener: Events[E]): this
emit<E extends keyof Events> (event: E, ...args: Arguments<Events[E]>): boolean
eventNames (): (keyof Events)[]
listeners<E extends keyof Events> (event: E): Events[E][]
listenerCount<E extends keyof Events> (event: E): number
getMaxListeners (): number
setMaxListeners (maxListeners: number): this
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment