type Events = {↵
login: { userId: string };↵
logout: { timestamp: number };↵
};↵
class Emitter<T extends Record<string, unknown>> {↵
private handlers: Partial<{ [K in keyof T]: ((data: T[K]) => void)[] }> = {};↵
on<K extends keyof T>(event: K, handler: (data: T[K]) => void) {↵
(this.handlers[event] ??= []).push(handler);↵
}↵
emit<K extends keyof T>(event: K, data: T[K]) {↵
this.handlers[event]?.forEach((h) => h(data));↵
}↵
}↵
const emitter = new Emitter<Events>();↵
emitter.on("login", (d) => console.log(d.userId));↵
emitter.emit("login", { userId: "abc123" });