You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 07:09:18