如何实现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
相关产品推荐
相关产品推荐

