@alex_bulkin

Возможно ли так типизировать класс?

Есть такой код
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
  • Вопрос задан
  • 83 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы