Untitled
unknown
plain_text
22 days ago
724 B
14
Indexable
type Listener = (...args: any[]) => void; type ListenerArgs<T> = T extends Listener ? Parameters<T> : never; export class EventEmitter<E> { private events = new Map(); // Can't really make this typesafe. public on<T extends keyof E>(type: T, listener: E[T]) { const { events } = this; const listeners = events.get(type); if (listeners) { listeners.add(listener); } else { events.set(type, new Set([listener])); } } public off<T extends keyof E>(type: T, listener: E[T]) { this.events.get(type)?.delete(listener); } public emit<T extends keyof E>(type: T, ...args: ListenerArgs<E[T]>) { this.events.get(type)?.forEach((listener: Listener) => listener(...args)); } }
Editor is loading...
Leave a Comment