interface Events {
login: { user: string };
logout: {};
}
class TypedEmitter<T> {
private listeners: { [K in keyof T]?: ((payload: T[K]) => void)[] } = {};
on<K extends keyof T>(eventName: K, listener: (payload: T[K]) => void): void {
if (!this.listeners[eventName]) {
this.listeners[eventName] = [];
}
this.listeners[eventName]!.push(listener);
}
emit<K extends keyof T>(eventName: K, payload: T[K]): void {
if (!this.listeners[eventName]) return;
for (const listener of this.listeners[eventName]!) {
listener(payload);
}
}
}
const emitter = new TypedEmitter<Events>();
emitter.on('login', data => console.log(data.user));
emitter.emit('login', { user: 'Alice' });This code defines event types, creates a typed emitter, adds a listener for 'login', and emits a 'login' event with a typed payload.