skip to content

TypeScript
使用 mitt 二次封装 EventEmitter

import mitt, { Emitter, Handler, EventType } from 'mitt'

type EventMap = {
  [key: EventType]: unknown
}

type TypedHandler<T extends EventMap, K extends keyof T> = Handler<T[K]>

export class EventEmitter<T extends EventMap> {
  private emitter: Emitter<T>

  constructor() {
    this.emitter = mitt<T>()
  }

  on<K extends keyof T>(type: K, handler: TypedHandler<T, K>) {
    this.emitter.on(type, handler)
  }

  off<K extends keyof T>(type: K, handler: TypedHandler<T, K>) {
    this.emitter.off(type, handler)
  }

  emit<K extends keyof T>(type: K, event: T[K]) {
    this.emitter.emit(type, event)
  }
}