Skip to content

Instantly share code, notes, and snippets.

@gvergnaud
Last active July 9, 2024 13:01
Show Gist options
  • Save gvergnaud/b7835f991c1f80a5fcdda2bbfc0ee3cb to your computer and use it in GitHub Desktop.
Save gvergnaud/b7835f991c1f80a5fcdda2bbfc0ee3cb to your computer and use it in GitHub Desktop.
class EventEmitter<T extends object> {
listeners: { [K in keyof T]?: Set<(data: T[K]) => void> } = {};
on<K extends keyof T>(name: K, cb: (data: T[K]) => void) {
const listeners = this.listeners[name] ?? new Set();
listeners.add(cb);
this.listeners[name] = listeners;
return () => listeners.delete(cb);
}
emit<K extends keyof T>(name: K, data: T[K]) {
const listeners = this.listeners[name] ?? new Set();
listeners.forEach((fn) => fn(data));
}
}
const eventEmitter = const EventEmitter<{ data: number, error: Error }>()
eventEmitter.on('data', data => ...) // data: number
eventEmitter.on('error', err => ...) // err: Error
eventEmitter.emit('data', "oops") // ❌ expected number
eventEmitter.emit('error', new Error("✅"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment