我有这种类型的

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;

推荐答案

要获取以下类型

类型ResultT={EVENT_NAME:"AAA",值:STRING}|{EVENT_NAME:"BBB",VALUE:NUMBER}

以下是解决方案:

type ResultT = { [K in t1[number]]: { event_name: K; value: EventDataMap[K] } }[t1[number]];

对于问题2:我们需要使用Extract实用程序类型,以确保T仅限于EventDataMap中存在的keys ("aaa" | "bbb" | "ccc").这允许将T用作EventDataMap的索引,而不会导致错误.

解决方案:

    type rt = Extract<t1[number], keyof EventDataMap> extends infer T
  ? T extends keyof EventDataMap
    ? { event_name: T; value: EventDataMap[T] }
    : never
  : never;

Typescript相关问答推荐

用泛型类型覆盖父类函数导致类型y中的Property x不能赋给基类型Parent中的相同属性."'''''' "

SortKey类型不起作用,尽管它使用的单个类型工作正常<>'

webpack错误:模块找不到.当使用我的其他库时,

具有继承的基于类的react 组件:呈现不能分配给基类型中的相同属性

类型脚本基于数组作为泛型参数展开类型

在不更改类型签名的情况下在数组并集上映射文字

为什么有条件渲染会导致material 自动完成中出现奇怪的动画?

用于验证字符串变量的接口成员

为什么不能使用$EVENT接收字符串数组?

Select 下拉菜单的占位符不起作用

如何从接口中省略接口

在单独的组件中定义React Router路由

为什么在这种情况下,打字脚本泛型无法正确自动完成?

Typescript泛型调用对象';s方法

如何为对象数组中的每个条目推断不同的泛型

Typescript:是否将联合类型传递给重载函数?

具有枚举泛型类型的 Typescript 对象数组

对象只能使用 Typescript 中另一个对象的键

使用受保护的路由和入门来响应路由

如何让 Promise 将它调用的重载函数的类型转发给它自己的调用者?