操作符keyof的作用是什么

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

使用 keyof 操作符可以在编译时获得一个类型的属性名,然后将这些属性名作为联合类型进行处理或操作。它可以用于访问对象的属性,定义映射类型,以及进行类型约束等场景。

下面是一些示例来说明 keyof 的作用:

  1. 访问对象的属性:
复制代码
  interface Person {
      name: string;
      age: number;
  }

  const person: Person = {
      name: "Alice",
      age: 25,
  };

  type PersonKeys = keyof Person; // 联合类型:"name" | "age"

  console.log(person["name"]); // 访问对象属性

在上述示例中,PersonKeys 类型通过 keyof Person 获取了 Person 接口的属性名,即 "name" 和 "age",作为联合类型。

  • 定义映射类型:

复制代码
  interface Person {
      name: string;
      age: number;
  }

  type ReadonlyPerson = {
      readonly [K in keyof Person]: Person[K];
  };

  const readonlyPerson: ReadonlyPerson = {
      name: "Alice",
      age: 25,
  };

  readonlyPerson.name = "Bob"; // 错误,只读属性无法修改

在上述示例中,通过使用 keyof Person,我们创建了一个映射类型 ReadonlyPerson,将 Person 接口的所有属性都设置为只读。

  • 进行类型约束:
复制代码
   function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
       return obj[key];
   }

   const person: Person = {
       name: "Alice",
       age: 25,
   };

   const name = getProperty(person, "name"); // name 的类型为 string
   const age = getProperty(person, "age"); // age 的类型为 number
   const invalid = getProperty(person, "email"); // 错误,"email" 不是 Person 的属性名

在上述示例中,getProperty 函数使用了两个泛型参数 T 和 K extends keyof T。通过使用 keyof T,我们对第二个参数 key 进行了类型约束,确保它必须是 T 类型的属性名。

总结起来,keyof 操作符在 TypeScript 中用于获取一个类型的所有属性名组成的联合类型。它可以用于访问对象的属性,定义映射类型以及进行类型约束等场景,提供了更灵活和安全的类型操作。

相关推荐
wjjzhbb5 小时前
前端监控:给用户体验装上仪表盘
前端·ux
江湖有缘5 小时前
Docker实战 | Docker部署Minimalist-web-notepad个人笔记本
前端·docker·notepad++
Hilaku6 小时前
为什么我在团队里禁止使用 axios?
前端·javascript·程序员
兮动人6 小时前
Chrome 152 升级后本地请求全挂了?是 LNA 策略在搞事
前端·chrome·lna·local network
JarvanMo6 小时前
让 3D 在 Flutter 中焕发生机:Flutter GPU 与 flutter_scene 实战经验
前端
狂师6 小时前
太强了!GitHub上开源了一款AI自动化测试框架,0代码搞定前后端测试!
前端·后端·测试
只睡四小时7 小时前
Local-First 数据契约:一张表装下 4 类数据
前端·javascript·架构设计·local-first·数据契约
迅猛龙办公室7 小时前
Python函数实现反转一个只有3位数的整数
开发语言·前端·python
我星期八休息7 小时前
Redis 的原理和使用(2)
前端·数据库·redis·python·mysql·缓存·bootstrap
Java后端的Ai之路7 小时前
19-ReactJS最佳实践
前端·react.js·前端框架