Есть такой код
type EventsRecord = Record<string, (...args: any[]) => void>;
export class EventBus<Events extends EventsRecord> {
private events: Map<keyof Events, Set<Events[keyof Events]>>;
constructor() {
this.events = new Map();
}
on<K extends keyof Events>(event: K, listener: Events[K]): void {
if (!this.events.has(event)) {
this.events.set(event, new Set());
}
this.events.get(event)!.add(listener);
}
emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): void {
if (this.events.has(event)) {
this.events.get(event)!.forEach(listener => {
listener(...args);
});
}
}
}
Он отлично выполняют свою задачу, если передать ему типы при создании экземпляра класса
const bus = new EventBus<{
event: (data: string) => void;
}>();
bus.on('event', (data) => {
console.log(data);
});
bus.emit('event', 'Hello, World!');
Возможно ли написать типы так, чтобы не передавать объект EventsRecord, а они сами выводились из аргументов функции on?
Playground