Observer & Singleton Patterns

How should the Observer Pattern be implemented to handle different types of events?
class EventSubject {
  #handlers = new Map();

  on(eventType, handler) {
    if (!this.#handlers.has(eventType)) {
      this.#handlers.set(eventType, new Set());
    }
    this.#handlers.get(eventType).add(handler);
    return () => this.off(eventType, handler);
  }

  off(eventType, handler) {
    const handlers = this.#handlers.get(eventType);
    if (handlers) {
      handlers.delete(handler);
      if (handlers.size === 0) {
        this.#handlers.delete(eventType);
      }
    }
  }

  emit(eventType, data) {
    this.#handlers.get(eventType)?.forEach(handler => handler(data));
  }
}
Next Question (11/15)