我试图用事件的关键存在类型和事件的有效负载值来创建一个Map,但是我不能让回调接收正确事件的参数
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
const test: Record<Partial<EventImInterestedIn["type"]>, (data: EventImInterestedIn["data"]) => void> = {
event_a: ({some}) => {},
event_b: ({some_other}) => {}
}
Playground
我如何才能做到这一点?
谢谢
1条答案
按热度按时间vbkedwbf1#
如果你使用一个记录,你会失去
type
键和它的data
之间的连接,所以每个回调属性中的data
参数的类型将是所有data
字段的并集,而不是对应于type
的那个。你可以通过像这样声明一个Map类型来避免这个问题:
它Map
EventImInterestedIn
联合成员,并使用每个type
属性作为键(使用as
的键重Map),并使用适当的data
属性作为回调的参数。如果使用
Events
作为test
的类型,将推断出正确的回调参数类型:TypeScript playground