Skip to content

Instantly share code, notes, and snippets.

@edwinm
Created April 12, 2023 19:54
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 edwinm/c6b8c2652cba599829efcc7575f7cc57 to your computer and use it in GitHub Desktop.
Save edwinm/c6b8c2652cba599829efcc7575f7cc57 to your computer and use it in GitHub Desktop.
// by Simon Sturmer
// TypeScript: Building a better EventEmitter
// https://www.youtube.com/watch?v=Pl7pDjWd830
// Creative Commons-licence
type Listener<T extends Array<any>> = (...args: T) => void;
export class Eventemitter<EventMap extends Record<string, Array<any>>> {
private eventListeners: {
[K in keyof EventMap]?: Set<Listener<EventMap[K]>>;
} = {};
on<K extends keyof EventMap>(eventName: K, listener: Listener<EventMap[K]>) {
const listeners = this.eventListeners[eventName] ?? new Set();
listeners.add(listener);
this.eventListeners[eventName] = listeners;
}
emit<K extends keyof EventMap>(eventName: K, ...args: EventMap[K]) {
const listeners = this.eventListeners[eventName] ?? new Set();
for (const listener of listeners) {
listener(...args);
}
}
}
// ---
type User = {
id: string;
name: string;
}
type EventMap = {
login: [user: User],
logout: [],
}
const userAuthEmitter = new Eventemitter<EventMap>();
userAuthEmitter.on('login', (user) => {});
userAuthEmitter.emit('login', {id:'', name: ''});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment