Skip to content

Instantly share code, notes, and snippets.

@matsub
Created August 31, 2020 05:22
Show Gist options
  • Save matsub/8da226f7328c447d5fdd22dda9411aa5 to your computer and use it in GitHub Desktop.
Save matsub/8da226f7328c447d5fdd22dda9411aa5 to your computer and use it in GitHub Desktop.
Typed Event Emitter
import { EventEmitter } from "events";
interface TypedEventEmitter<T> {
addListener<K extends keyof T>(event: K, listener: (arg: T[K]) => void): this;
on<K extends keyof T>(event: K, listener: (arg: T[K]) => void): this;
once<K extends keyof T>(event: K, listener: (arg: T[K]) => void): this;
removeListener<K extends keyof T>(
event: K,
listener: (arg: T[K]) => void
): this;
removeAllListeners<K extends keyof T>(event?: K): this;
emit<K extends keyof T>(event: K, arg: T[K]): boolean;
}
export interface FooEvent {
arg1: string,
arg2: number,
}
export interface BarEvent {
arg1: string,
arg2: string,
}
interface MyEvents {
foo: FooEvent;
bar: BarEvent;
}
class MyEventEmitter extends EventEmitter
implements TypedEventEmitter<MyEvents> {}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment