typescriptintermediate
TypeScript Typed Event Emitter
Create type-safe event emitters in Node.js with full TypeScript support and autocomplete.
typescriptPress ⌘/Ctrl + Shift + C to copy
import { EventEmitter } from 'node:events';
// Define event map
interface OrderEvents {
created: [order: { id: string; amount: number }];
paid: [orderId: string, paymentId: string];
shipped: [orderId: string, trackingNumber: string];
cancelled: [orderId: string, reason: string];
error: [error: Error];
}
// Typed event emitter
class TypedEmitter<T extends Record<string, unknown[]>> {
private emitter = new EventEmitter();
on<K extends keyof T>(event: K, listener: (...args: T[K]) => void) {
this.emitter.on(event as string, listener as any);
return this;
}
off<K extends keyof T>(event: K, listener: (...args: T[K]) => void) {
this.emitter.off(event as string, listener as any);
return this;
}
emit<K extends keyof T>(event: K, ...args: T[K]) {
return this.emitter.emit(event as string, ...args);
}
once<K extends keyof T>(event: K, listener: (...args: T[K]) => void) {
this.emitter.once(event as string, listener as any);
return this;
}
}
// Usage
const orderBus = new TypedEmitter<OrderEvents>();
orderBus.on('created', (order) => {
console.log(`Order ${order.id} created: $${order.amount}`);
});
orderBus.on('paid', (orderId, paymentId) => {
console.log(`Order ${orderId} paid via ${paymentId}`);
});
orderBus.on('error', (err) => {
console.error('Order error:', err.message);
});
// Fully typed: autocomplete works on event names and args
orderBus.emit('created', { id: 'ord_123', amount: 99.99 });
orderBus.emit('paid', 'ord_123', 'pay_456');Use Cases
- Type-safe pub/sub communication between modules
- Domain event handling in business logic
- Decoupled service communication
Tags
Related Snippets
Similar patterns you can reuse in the same workflow.
typescriptadvanced
Typed Event Emitter Class
Build a type-safe event emitter with TypeScript generics for strongly-typed event handling.
Best for: Type-safe event-driven architecture
#nodejs#events
typescriptintermediate
Event-Driven Architecture Pattern
Build loosely coupled systems with typed event bus, async event handlers, and domain event patterns.
Best for: Microservice communication
#nodejs#events
typescriptintermediate
Request Validation Schema Builder
Build a lightweight request validation layer with type inference for API endpoints.
Best for: API request body validation
#nodejs#validation
typescriptbeginner
Custom Error Classes
Create typed custom error classes with HTTP status codes, error codes, and structured error handling.
Best for: Structured API error responses
#nodejs#error