给定一条数据结构(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>;
你的问题在于如何为每个名字生成一个类型,如果对应的 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。 当有子级数据的时候,关心的是子