我有这种类型的
interface EventDataMap
{
"aaa": string;
"bbb": number;
"ccc": boolean;
}
type t1 = [ "aaa", "bbb" ]
我想要直接获取以下类型
type resultT = { event_name: "aaa", value: string } | { event_name: "bbb", value: number }
这非常类似于数组的map方法,我试图编写以下类型,但得到了错误.
type rt = t1[number] extends infer T ? {event_name: T, data: EventDataMap[T]} : never;
我也知道如何正确获取我想要的类型,但我觉得这种方式还不够好,一个原因是它不够通用,另一个原因是它不够直接,下面的实现我认为有很多不完善之处
interface EventDataMap
{
"aaa": string;
"bbb": number;
"ccc": boolean;
[p: string]: any; // This statement is necessary, but it seems superfluous
}
type t1 = [ "aaa", "bbb" ]
// I think UnionToSomeObj is not generic enough, this generic is extracted separately, but in fact its value applies to a single scene, if you can write a generic generic I think it is acceptable
type UnionToSomeObj<T> = T extends string ? {event_name: T, data: EventDataMap[T]} : never;
type t3 = UnionToSomeObj<t1[number]>;
最后一个问题,我想有两个.
问题1:如何获得类似于map函数的泛型类型?
问题2:我试着写的类型是type rt = t1[number] extends infer T ? {event_name: T, data: EventDataMap[T]} : never;
为什么T不起作用?
事实上,我还想到了一种特殊的写作方式.当然,不支持这种语法类型.type rt = t1[number] as p extends string ? {event_name: p, data: EventDataMap[p]} : never;