如何获取对象的键?以及如何定义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']; // ✅ 无类型错误
递归类型的逻辑说明:
- 先判断
T是否为对象类型:如果不是,返回never(表示没有嵌套键可提取)。 - 遍历对象的每个键
K:要么保留当前键K,要么递归处理T[K]的类型,提取它的深层键。 - 最后通过
[keyof T]将所有层级的键合并为一个联合类型,最终Key会被解析为"a" | "b" | "c"。
内容的提问来源于stack exchange,提问作者MilV
相关产品推荐
相关产品推荐

