如何获取嵌套对象中tabs后代对象的所有键名联合类型?
获取深度嵌套数组类型中所有tabs对象的键名联合类型
我有一个深度嵌套的数组类型Test,需要提取其中所有tabs后代对象的键名,组成联合类型。举个例子,基于以下Test类型:
type Test = [ { asds: 123, fefes: "fdsfds", meta: { ma: string, child: boolean, tabs: { tab1: "123", tab2: "234", tab3: "345" } } }, { dffg: "dfsf" }, { dfs: 4454, meta: { tabs: { tab4: "888" } } }, { meta: { eee: 888 } } ]
期望得到的结果是"tab1" | "tab2" | "tab3" | "tab4"。
解决方案
可以通过递归条件类型遍历嵌套结构,精准提取所有tabs对象的键:
// 递归提取类型中所有tabs对象的键 type ExtractTabKeys<T> = T extends { tabs: infer U } ? keyof U : T extends object ? { [K in keyof T]: ExtractTabKeys<T[K]> }[keyof T] : never; // 处理数组类型,遍历每个元素提取tab键 type TabKeysFromArray<T extends any[]> = ExtractTabKeys<T[number]>; // 最终得到目标联合类型 type Result = TabKeysFromArray<Test>; // 类型为 "tab1" | "tab2" | "tab3" | "tab4"
代码说明
ExtractTabKeys:核心递归类型,先检查当前类型是否包含tabs属性,若有则直接返回该对象的键联合类型;若当前是普通对象,则递归遍历其所有属性继续查找tabs;非对象类型返回never,不参与联合类型构建。TabKeysFromArray:针对数组类型,先取出数组所有元素的联合类型,再传入ExtractTabKeys处理,汇总所有元素中的tabs键。
内容的提问来源于stack exchange,提问作者Autumn
相关产品推荐
相关产品推荐

