跳转到内容

TypedEventTarget

TypedEventTarget 是扩展自 EventTarget 的强类型版本,允许通过泛型对事件名称和事件对象类型进行严格检查,从而提高类型安全性和开发体验。

ts
// event-target.ts

export type TypedEventListenerOrTypedEventListenerObject<E extends Event = Event> =
  | TypedEventListener<E>
  | TypedEventListenerObject<E>

export interface TypedEventListenerObject<E extends Event> {
  handleEvent(object: E): void
}

export interface TypedEventListener<E extends Event> {
  (evt: E): void
}

export class TypedEventTarget<T extends Record<string, Event> = {}> extends EventTarget {
  addEventListener<K extends keyof T>(
    type: K,
    callback: TypedEventListenerOrTypedEventListenerObject<T[K]> | null,
    options?: AddEventListenerOptions | boolean,
  ) {
    super.addEventListener(type as string, callback as EventListener, options)
  }

  removeEventListener<K extends keyof T>(
    type: K,
    callback: TypedEventListenerOrTypedEventListenerObject<T[K]> | null,
    options?: EventListenerOptions | boolean,
  ) {
    super.removeEventListener(type as string, callback as EventListener, options)
  }

  dispatchEvent(event: T[keyof T]) {
    return super.dispatchEvent(event)
  }
}

使用示例:

ts
// 定义事件类型
type EventMap = {
    message: MessageEvent;
    error: Event;
};

// 创建实例
const eventTarget = new TypedEventTarget<EventMap>();

// 添加监听器
eventTarget.addEventListener('message', (message) => {
    console.log(`Message received: ${message}`);
});

// 添加错误事件监听
eventTarget.addEventListener('error', (error) => {
    console.error('Error received:', error);
});

// 派发事件
eventTarget.dispatchEvent(new MessageEvent('message'));
eventTarget.dispatchEvent(new Event('error'));