Senior Typescript
Senior
technical
How would you design a generic type-safe event emitter in TypeScript that allows subscribing to specific event types and emits them with typed payloads? Consider the ability to handle multiple listeners for each event type and the need to unregister listeners. Discuss the structure and provide example usage.
type Listener<T> = (payload: T) => void;
class EventEmitter<T extends Record<string, any>> {
private listeners: { [K in keyof T]?: Listener<T[K]>[] } = {};
on<K extends keyof T>(event: K, listener: Listener<T[K]>): void {
if (!this.listeners[event]) this.listeners[event] = [];
this.listeners[event]!.push(listener);
}
emit<K extends keyof T>(event: K, payload: T[K]): void {
this.listeners[event]?.forEach(listener => listener(payload));
}
off<K extends keyof T>(event: K, listener: Listener<T[K]>): void {
this.listeners[event] = this.listeners[event]?.filter(l => l !== listener);
}
}
// Example usage:
const emitter = new EventEmitter<{ click: { x: number; y: number }; keypress: string }>();
emitter.on('click', (payload) => console.log(`Clicked at ${payload.x}, ${payload.y}`));
emitter.emit('click', { x: 10, y: 20 });
Trusted by 100+ professionals preparing for interviews
Trusted by 100+ professionals
50+ Company Question Banks
5+ Supported Languages
Practice More Questions Like This
Generate unlimited interview questions with structured answers, code runner, and AI-powered walkthroughs.
Get Started Free