当前位置: 首页 > 知识库问答 >
问题:

前端 - 问一个typescript类型问题?

长孙和悦
2023-10-09

给定一条数据结构(API数组里面的个数是未知的)如下所示

const api = [    {        name: 'pageA',        table: true    },    {        name: 'pageB',    }]

如何推导出类似这样的类型

type Result = {    pageA: boolean    pageB: unknown}

即 name 作为key, 如果存在table即为boolean类型,否则为unknown类型
ts的大神们,这个该如何写啊,百度,谷歌都折腾了,还问了gpt也不行,就是值推不出来
我写的是这样的

const api = [    {        name: 'pageList',        table: true    },    {        name: 'pageAdd',        table: false    }] as const;type Ret<T extends readonly { name: string; table?: boolean }[]> = {    [K in T[number]['name']]:  // 这里不会写};type Api = Ret<typeof api>;

共有1个答案

陆烨烁
2023-10-09

你的问题在于如何为每个名字生成一个类型,如果对应的 table 属性为 true,则为 boolean 类型,否则为 unknown 类型。

在 TypeScript 中,你可以使用 keyof 和类型推断来解决这个问题。首先,你需要将 api 数组中的对象字面量转换为类型,然后你可以使用 keyof 来获取每个对象可能拥有的键的集合。最后,你可以使用类型推断和逻辑或操作符 | 来为每个键指定一个类型。

下面是你可以尝试的代码:

const api = [    {        name: 'pageA',        table: true    },    {        name: 'pageB',    }] as const;type Result = {    [K in keyof typeof api]:     typeof api[0][K] extends boolean ? K : never    | K extends keyof typeof api[0] ? never : K};// 输出如下:// type Result = {//     pageA: "pageA" | never;//     pageB: "pageB" | never;// }

在这个类型中,我们首先使用 keyof typeof api 来获取所有可能的键的集合。然后,对于每一个键 K,我们检查该键在 api[0] 中是否存在并且是 boolean 类型。如果满足这个条件,那么我们就将该键的类型设置为 K。否则,我们就将该键的类型设置为 never。这样,我们就成功地为每个键生成了一个类型,如果该键在 api[0] 中存在并且是 boolean 类型,那么它的类型就是它的名字,否则它的类型就是 never

 类似资料:
  • 在文件 /src/stores/otpInfos.ts 的第 7 行,TypeScript 报出以下错误(但是执行 pnpm dev 运行是没有任何问题的): 如果没有引用 ".pnpm/@vueuse+shared@9.13.0_vue@3.3.4/node_modules/@vueuse/shared",则无法命名 "useOTPInfosStore" 的推断类型。这很可能不可移植。需要类型注

  • 我想解决的是res.Code下面的红线问题 下面是loginApi接口的类型定义: 其中UserType类型的定义: IResponse类型的定义: 为什么Promise的返回值Code,Data,Msg下面都带红线? 代码:

  • 为什么if片段内的isCache类型被收窄为true,而else片段内的isCache类型推导是boolean。我预期的是else片段内的isCache类型应该推导为false,求解答。 尝试了一下应该不是编辑器的问题。

  • 怎么修改让下面的红线消失?

  • 代码如下,这是一段示例代码 那段for循环是想过滤有效数据。 问题是这段代码ts报错,代码逻辑没问题,问题的根本出在MenuItem的类型定义上,本意是想定义一个二级级联数据MenuItem,之所以使用T extends string而不是直接写为string,是因为在某些交互函数的参数中,希望将代表command的参数定义一个固定的可选数据CommandType。 当有子级数据的时候,关心的是子