mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
1384 字
4 分钟
TypeScript操作符关于keyof
2026-03-06

TypeScript 的 keyof 特性对于处理对象类型中属性名称的开发者非常实用。当你使用 keyof 关键字时,TypeScript 能够推断出对象类型的所有键名,形成一个字符串字面量或数字字面量的联合类型。这可以验证键名是否正确,从而防止常见的编码错误。本质上,keyof 把一个对象类型的所有键收集起来,形成一个联合类型,帮助开发者编写更灵活、可复用的代码。

这个特性在访问和修改对象类型的键及其对应值时特别有用,能显著提升静态类型分析和类型检查的强度。而且将 keyof 与映射类型(Mapped Types)等高级类型功能结合使用,可以对对象类型及其属性实现更精细的控制。

为什么 TypeScript 的 keyof 很重要?#

keyof 在 TypeScript 中至关重要,因为它在处理对象键时提供了极高的灵活性类型安全性。它能从对象类型中提取出所有键的类型,从而让开发者编写更加通用、可复用的代码。

一个非常常见的场景是:编写泛型函数来操作对象的某个键。例如,一个函数接收一个对象和一个键名,然后返回对应的值,使用 keyof 可以确保传入的键名一定是该对象上真实存在的属性。如果对象结构以后发生变化,TypeScript 会自动提示错误。

此外,keyof 还常与 typeof、枚举等结合使用,来创建常量类型,确保能完整覆盖所有可能的枚举值或对象键。

TypeScript 的 keyof 是如何工作的?#

keyof 操作符从一个对象类型中提取出其所有键的类型,最终生成一个由字符串字面量或数字字面量组成的联合类型

例如:

type Person = {
name: string;
age: number;
gender: 'male' | 'female';
};
type PersonKeys = keyof Person;
// PersonKeys = 'name' | 'age' | 'gender'

这个 PersonKeys 类型就可以用来保证类型安全地访问或操作 Person 对象的属性。keyof 同时支持字符串键和数字键(例如索引签名),在很多类型操作场景中都非常实用。

对象类型与 keyof 操作符#

理解 TypeScript 中的对象类型#

TypeScript 中的对象类型通过定义属性及其类型,来描述一个对象的形状。这种方式能在编译期捕获潜在错误,而不是等到运行时才发现问题。对象类型显著提高了代码的可维护性和可读性,提供了明确的属性预期,并充分利用了 TypeScript 的类型推断、智能自动补全和文档提示功能。同时也方便创建可复用的组件和接口,促进了代码的封装与模块化。

探索 keyof 操作符#

keyof 操作符从对象类型或接口中提取所有键,生成这些键的联合类型。例如:

interface Person {
name: string;
age: number;
}
type Keys = keyof Person; // 'name' | 'age'

它经常与映射类型一起使用,例如结合可选修饰符 ? 来创建 Partial 版本:

type PartialPerson = {
[K in keyof Person]?: Person[K];
};

将 keyof 用于对象类型#

keyof 在处理对象类型时非常强大,它能提取出对象的所有键,形成一个安全的键联合类型。需要注意的是,keyof 只适用于对象类型,并且返回的是字符串字面量或数字字面量的联合类型。

联合类型、字面量类型与 keyof#

TypeScript 中的联合类型#

联合类型允许一个变量可以持有多种类型的值,例如 string | number,提供了很大的灵活性,同时仍保持类型安全,有助于在编译期捕获错误。

结合字面量类型与 keyof#

当你把 keyof 与对象类型结合时,即使不知道确切的对象结构,也能安全地动态访问属性。它会生成一个代表所有可能键的字面量联合类型,非常适合处理外部来源的对象数据。

将联合类型、字面量类型与 keyof 结合#

通过 keyof + 联合类型 + 字面量类型,可以创建非常精确且灵活的类型定义。例如:

function getValue<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}

当对象类型属性发生变化时,代码会自动受到类型检查的约束,大大降低重构时的出错风险。

返回类型与泛型函数中的 keyof#

定义返回类型#

结合条件类型(Conditional Types)和 keyof,可以创建非常精确的返回类型,也常用于生成常量类型,提升类型安全性。

实现带 keyof 的泛型函数#

使用 keyof 的泛型函数可以针对任意对象类型进行操作:

function pick<O, K extends keyof O>(obj: O, keys: K[]): Pick<O, K> {
// ...
}

这种写法极大地提高了代码的复用性和类型安全性。

将 keyof 应用于返回类型#

对一个函数的返回类型使用 keyof,可以得到该返回对象所有可能的键:

type ReturnedKeys = keyof ReturnType<typeof someFunction>;
// 得到函数返回对象的所有键名联合类型

此外,keyof 经常与 typeof 一起使用,根据实际对象结构动态生成类型,是 TypeScript 类型编程中非常核心且强大的工具之一。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

TypeScript操作符关于keyof
http://s0ralin.github.io/posts/typescript操作符关于keyof/
作者
まつざか ゆき
发布于
2026-03-06
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00