TypeScript如何提取排除undefined属性的嵌套键对应数组类型
TypeScript 提取嵌套对象有效值的叶子键联合类型
实现代码
直接通过递归条件类型即可实现,核心逻辑是遍历属性时过滤值为undefined的字段,遇到对象就递归深入,遇到基础类型值就返回当前键名,最终组合为联合类型:
type ExtractValidNestedKeys<T> = { [K in keyof T]-?: T[K] extends undefined ? never : T[K] extends object ? ExtractValidNestedKeys<T[K]> : K }[keyof T]
使用示例
针对给出的Data类型,直接传入泛型即可得到目标类型:
type Data = { foo: { foo_id: number; }; bar: undefined; abc: { abc_id: number } }; // ValidKeys 类型为 'foo_id' | 'abc_id' type ValidKeys = ExtractValidNestedKeys<Data> // 如果需要数组类型,直接套Array即可: type ValidKeysArray = ValidKeys[] // 即 ('foo_id' | 'abc_id')[]
逻辑说明
-?修饰符用来去掉可选属性带来的undefined干扰,确保遍历所有必填属性- 遇到值为
undefined的属性直接返回never,联合类型中never会被自动忽略,实现过滤效果 - 遇到值为对象的属性就递归调用自身,继续深入提取内层键
- 遇到非对象的基础类型值,就返回当前的键名,最后通过
[keyof T]取出所有属性的返回值组成联合类型
如果场景里存在数组、函数这类特殊对象类型不需要递归,可以在对象判断分支里加额外的过滤规则,比如T[K] extends any[] ? never : ExtractValidNestedKeys<T[K]>即可跳过数组属性。
内容的提问来源于stack exchange,提问作者kofyohugna
相关产品推荐
相关产品推荐

