TypeScript 基础指南:keyof 操作符

keyof 是 TypeScript 中的一个特殊操作符,它可以用于获取某种类型的所有键(属性名)组成的联合类型。

keyof 的基本语法如下:
type KeyType = keyof ObjectType;
在这个语法中:
ObjectType 是一个对象类型。
KeyType 是一个由 ObjectType 的所有键组成的联合类型。
下面是一个具体的例子:
interface Person {
  name: string;
  age: number;
  email: string;
}

type PersonKey = keyof Person; // type PersonKey = "name" | "age" | "email"
在这个例子中:
1.
我们定义了一个 Person 接口,它包含 name、age 和 email 三个属性。
2.
我们使用 keyof 操作符获取 Person 接口的所有键,组成一个联合类型 PersonKey。
keyof 操作符的主要用途包括:
动态属性访问
可以使用 keyof 类型来动态地访问对象的属性,而不是硬编码属性名。
泛型约束
可以使用 keyof 来约束泛型类型,确保它只能是对象的键。
类型安全的映射
可以结合 [key: KeyType] 语法,创建一个新的对象类型,其属性名和值类型都是基于原有对象类型。
下面是一个示例,演示了 keyof 在实际开发中的应用:
function getValue<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}

const person = { name: 'John', age: 30, email: 'john@example.com' };
console.log(getValue(person, 'name')); // 输出: 'John'
console.log(getValue(person, 'age')); // 输出: 30
console.log(getValue(person, 'address')); // 错误: 'address' 不是 'Person' 的属性
在这个例子中:
1.
getValue 函数接受一个泛型参数 T(对象类型)和一个泛型参数 K(对象的键类型)。
2.
K extends keyof T 约束了 K 必须是 T 类型的键。
3.
函数内部使用 T[K] 获取对象 obj 中 key 属性的值类型。
4.
我们成功地使用 getValue 函数访问了 person 对象的 name 和 age 属性,但尝试访问 'address' 属性时会报错,因为它不是 Person 类型的属性。

总之, keyof 是 TypeScript 中一个非常有用的操作符,它可以帮助开发者编写更加类型安全和可维护的代码。通过结合 keyof 和其他 TypeScript 特性,开发者可以创建出更加健壮和灵活的应用程序。