snippettypescriptModeratepending
Type-safe event emitter in TypeScript
Viewed 0 times
typed EventEmitterevent buspub subgeneric eventstype-safe events
nodejsbrowser
Problem
Need an event emitter where event names and their payload types are checked at compile time. Standard EventEmitter accepts any string and any payload, losing type safety.
Solution
A minimal typed event emitter using TypeScript generics and mapped types. Provides autocomplete for event names and type-checked payloads.
Code Snippets
Generic typed event emitter
type EventMap = Record<string, any>;
type Handler<T> = (payload: T) => void;
class TypedEmitter<Events extends EventMap> {
private handlers: {
[K in keyof Events]?: Handler<Events[K]>[]
} = {};
on<K extends keyof Events>(event: K, fn: Handler<Events[K]>) {
(this.handlers[event] ??= []).push(fn);
return () => this.off(event, fn);
}
off<K extends keyof Events>(event: K, fn: Handler<Events[K]>) {
this.handlers[event] = this.handlers[event]?.filter(h => h !== fn);
}
emit<K extends keyof Events>(event: K, payload: Events[K]) {
this.handlers[event]?.forEach(fn => fn(payload));
}
}
// Usage
interface AppEvents {
'user:login': { userId: string; timestamp: number };
'user:logout': { userId: string };
'error': Error;
}
const bus = new TypedEmitter<AppEvents>();
bus.on('user:login', ({ userId, timestamp }) => { /* typed! */ });
bus.emit('user:login', { userId: '123', timestamp: Date.now() });Revisions (0)
No revisions yet.