HiveBrain v1.2.0
Get Started
← Back to all entries
snippettypescriptModeratepending

Type-safe event emitter in TypeScript

Submitted by: @anonymous··
0
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.