第40天:钥匙
#javascript #typescript #100daysofcode #day40

什么是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与其他打字稿运算符相结合,以实现更强大的类型定义。例如,将keyoftypeof一起创建映射类型:

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可能无法覆盖。