Skip to content

Instantly share code, notes, and snippets.

@xingrz
Last active April 21, 2022 06:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xingrz/0de4a7a56ef949fd7bd31fef5410dbf0 to your computer and use it in GitHub Desktop.
Save xingrz/0de4a7a56ef949fd7bd31fef5410dbf0 to your computer and use it in GitHub Desktop.
Typed NodeJS.EventEmitter
const emitter: TypedEventEmitter<{
  start: () => void;
  stop: () => void;
  progress: (progress: number) => void;
}> = new EventEmitter();

emitter.on('progress', (progress) => {
  // foo
});
export interface IRecorder extends TypedEventEmitter<{
  start: () => void;
  stop: () => void;
  progress: (progress: number) => void;
}> {
  start(): Promise<void>;
  stop(): Promise<void>;
}

class Recorder extends EventEmitter implements IRecorder {
  // ...
}

const rec: IRecorder = new Recorder();
rec.on('progress', (progress) => {
  // ...
});
import EventEmitter from 'events';
export default interface TypedEventEmitter<Emits extends TypedEmits> extends EventEmitter {
addListener<K extends keyof Emits>(event: K, listener: Emits[K]): this;
emit<K extends keyof Emits>(event: K, ...args: Parameters<Emits[K]>): boolean;
off<T extends keyof Emits>(type: T, listener: Emits[T]): this;
on<T extends keyof Emits>(type: T, listener: Emits[T]): this;
once<T extends keyof Emits>(type: T, listener: Emits[T]): this;
prependListener<T extends keyof Emits>(type: T, listener: Emits[T]): this;
prependOnceListener<T extends keyof Emits>(type: T, listener: Emits[T]): this;
removeAllListeners<T extends keyof Emits>(type?: T): this;
removeListener<T extends keyof Emits>(type: T, listener: Emits[T]): this;
}
type EmitParameters = Parameters<typeof EventEmitter.prototype.emit>;
type TypedEmits = Record<EmitParameters[0], EmitParameters[1]>;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment