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

如何获取对象的键?以及如何定义TypeScript类型以获取嵌套接口的所有嵌套键?

我来帮你逐个解答这两个TypeScript相关的问题:

1. 如何获取一个对象的键?

这里得分运行时和类型层面两种核心场景来说明:

  • 运行时获取实际键:直接使用Object.keys()方法,它会返回对象所有可枚举的字符串键组成的数组。示例代码:
    const user = { name: "Bob", age: 28 };
    const keys = Object.keys(user); // 类型为string[]
    
    注意:Object.keys()默认返回string[]而非精确的keyof typeof user,这是因为TypeScript无法确保运行时对象没有额外属性。如果确定对象完全符合静态类型,可以用类型断言缩小范围:
    const typedKeys = Object.keys(user) as Array<keyof typeof user>; // 类型为("name" | "age")[]
    
  • 类型层面提取键类型:使用keyof操作符,它能直接提取对象类型的所有键的联合类型。示例:
    type UserType = { name: string; age: number };
    type UserKeys = keyof UserType; // 类型为"name" | "age"
    
2. 定义包含嵌套层级所有键的Key类型

要实现这个需求,我们需要编写一个递归条件类型,用来遍历接口的所有层级属性并收集所有键名。针对你给出的接口A,具体实现如下:

interface A {
  a: string;
  b: { c: string; };
}

// 递归类型:提取对象所有层级的键
type DeepKeys<T> = T extends object
  ? {
      [K in keyof T]: K | DeepKeys<T[K]>;
    }[keyof T]
  : never;

// 定义目标Key类型
type Key = DeepKeys<A>;

// 验证:完全符合需求
const test: Key[] = ['a', 'b', 'c']; // ✅ 无类型错误

递归类型的逻辑说明:

  1. 先判断T是否为对象类型:如果不是,返回never(表示没有嵌套键可提取)。
  2. 遍历对象的每个键K:要么保留当前键K,要么递归处理T[K]的类型,提取它的深层键。
  3. 最后通过[keyof T]将所有层级的键合并为一个联合类型,最终Key会被解析为"a" | "b" | "c"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:27:45