keyof
是 TypeScript 中的一个关键字,用于获取某种类型的所有键(属性名)的联合类型。它常与泛型一起使用,以增强函数的类型安全性和灵活性。
假设我们有一个对象类型 Person
:
interface Person {
name: string;
age: number;
email: string;
}
使用 keyof
可以得到这个接口所有属性名的联合类型:
type PersonKeys = keyof Person; // "name" | "age" | "email"
keyof
可以创建更通用的函数。keyof T
的结果是一个联合类型,包含了类型 T
所有属性名的字符串字面量类型。
有时 TypeScript 可能无法准确推断泛型的具体类型,尤其是在复杂类型或嵌套对象的情况下。
解决方法:
keyof
时遇到编译错误可能是因为传入的键不是目标类型的有效属性。
解决方法:
以下是一个综合示例,展示了如何使用 keyof
和泛型来创建一个安全的属性访问函数:
interface Person {
name: string;
age: number;
email: string;
}
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const person: Person = { name: 'Alice', age: 30, email: 'alice@example.com' };
// 正确使用
const name = getProperty(person, 'name'); // name 是 string 类型
const age = getProperty(person, 'age'); // age 是 number 类型
// 错误使用(TypeScript 编译器会报错)
// const invalid = getProperty(person, 'invalidKey'); // Error: Argument of type '"invalidKey"' is not assignable to parameter of type '"name" | "age" | "email"'.
通过这种方式,可以确保在编译阶段就捕获到潜在的错误,提高代码的健壮性。
领取专属 10元无门槛券
手把手带您无忧上云