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

如何在TypeScript映射类型中无需判断字符串键实现链式键?

嵌套对象的点连接键类型生成方案

TypeScript 4.x 解决方案

要避免每次添加key extends string ? ... : never的判断,你可以在遍历对象键时直接筛选出string类型的键——依赖泛型约束T extends Record<string, any>无法完全解决问题,因为TypeScript允许对象包含额外的symbol/number键。

实现代码如下:

type NestedKeys<T> = T extends object 
  ? { 
      [K in Extract<keyof T, string>]: 
        `${K}` | `${K}.${NestedKeys<T[K]>}` 
    }[Extract<keyof T, string>] 
  : never;

测试示例

type TestObject = {
  a: { b: 'c' },
  d: 'asdf',
  [Symbol('test')]: number // 自动排除symbol键
};

type ResultKeys = NestedKeys<TestObject>;
// 结果:'a' | 'a.b' | 'd'

通过Extract<keyof T, string>直接获取对象中所有string类型的键,遍历过程中无需额外判断键的类型,自然避免了symbol类型导致的报错。

TypeScript 5.x 优化写法

TS5.x支持在映射类型中使用as子句直接过滤键,写法更直观,逻辑和TS4的方案一致:

type NestedKeys<T> = T extends object 
  ? keyof { 
      [K in keyof T as K extends string ? K : never]: 
        `${K}` | `${K}.${NestedKeys<T[K]>}` 
    } 
  : never;

该写法同样会自动排除非string类型的键,不需要额外的分支判断。

内容的提问来源于stack exchange,提问作者Sergio Tx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:44:59