You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现TypeScript事件类型与对应Payload回调的映射?

实现事件类型与对应回调的类型安全映射

你的问题在于当前用Record定义的回调类型是所有事件data的联合类型,导致每个回调必须兼容联合类型参数,无法匹配对应事件的具体Payload类型。要实现类型安全的事件-回调映射,需要利用TypeScript的映射类型为每个事件生成专属的回调签名。

正确实现代码

type DeviceEvent<T extends string, Data> = {
  type: T;
  data: Data;
}

type EventA = DeviceEvent<"event_a", {some: string}>
type EventB = DeviceEvent<"event_b", {some_other: string}>
type EventC = DeviceEvent<"event_c", {some_else: number}>
type EventD = DeviceEvent<"event_d", {some_elseNumber: number}>

type EventImInterestedIn = EventA | EventB | EventC

// 生成类型安全的回调映射:每个事件类型对应接收其专属Payload的回调
type EventCallbackMap = {
  [E in EventImInterestedIn as E["type"]]: (data: E["data"]) => void
}

// 使用Partial让映射中的键可选(无需实现所有事件的回调)
const test: Partial<EventCallbackMap> = {
    event_a: ({some}) => {}, // 自动推断参数为{some: string}
    event_b: ({some_other}) => {} // 自动推断参数为{some_other: string}
}

关键说明

  • 这里使用了条件映射类型(as E["type"]),将联合类型EventImInterestedIn中的每个事件成员转换为映射的键值对:
    • 键:事件的type字段值(如"event_a")
    • 值:仅接收该事件对应data类型的回调函数
  • Partial<EventCallbackMap>允许你只实现感兴趣的事件回调,无需覆盖所有事件类型。

内容的提问来源于stack exchange,提问作者ScreamZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:18:46