什么是keyof
?
Typescript中的keyof
操作员用于创建对象类型的所有属性名称(键)的联合类型。然后,该联合类型可用于定义和执行您的代码中的约束。
type KeyOfDemo = keyof { name: string; age: number }; // "name" | "age"
它是如何工作的?
应用于对象类型时,keyof
会生成包含该对象属性的所有键的联合类型。该联合类型可用于各种目的,例如索引,类型检查和创建更精确的类型定义。
2.实际用例
类型安全对象访问
keyof
最常见的用例之一是启用类型安全对象访问。考虑一个代表一个人的对象的场景:
const person = {
name: "John",
age: 30,
city: "New York",
};
通过使用keyof
,您可以创建一种类型,以确保您仅访问有效的属性:
type Person = typeof person;
type PersonKeys = keyof Person; // "name" | "age" | "city"
现在,您可以安全访问person
属性:
function getProperty(obj: Person, key: PersonKeys): any {
return obj[key];
}
const name = getProperty(person, "name"); // ✅ Type-safe
const invalid = getProperty(person, "gender"); // ❌ Compile-time error
执行属性密钥
您也可以使用keyof
来执行一个对象包含特定键:
function hasRequiredKeys(obj: Person, keys: ["name", "age"]): boolean {
return keys.every(key => key in obj);
}
const hasKeys = hasRequiredKeys(person, ["name", "age"]); // ✅ true
const missingKey = hasRequiredKeys(person, ["name", "gender"]); // ❌ false
功能参数验证
keyof
可以是验证功能参数的有价值工具,确保仅接受有效键:
function updatePerson(obj: Person, key: PersonKeys, value: any): void {
obj[key] = value; // ✅ Type-safe
}
updatePerson(person, "age", 31); // ✅
updatePerson(person, "gender", "Male"); // ❌ Compile-time error
3.高级技术
将keyof
与其他运营商相结合
您可以将keyof
与其他打字稿运算符相结合,以实现更强大的类型定义。例如,将keyof
与typeof
一起创建映射类型:
type OptionalPerson = {
[K in keyof Person]?: Person[K];
};
仿制药和keyof
generics和keyof
可用于创建灵活和可重复使用的类型安全功能:
function getPropertyByKey<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const cityName = getPropertyByKey(person, "city"); // ✅ Type-safe
4.常见的陷阱和最佳实践
避免字符串文字
与keyof
合作时,请避免使用字符串文字来维持类型安全:
const prop = "age";
const age = person[prop]; // ❌ No type checking
类型缩小
请记住,keyof
工会需要缩小条件检查:
type KnownKeys = "name" | "age";
function isKnownKey(key: string): key is KnownKeys {
return ["name", "age"].includes(key);
}
库中的关键
使用外部库时,请谨慎地假设属性密钥。库可能使用诸如基于符号的键之类的技术,而keyof
可能无法覆盖。