当前位置: 首页 > news >正文

TS 中 keyof 和 in 关键字详解

在 TypeScript 中,keyofin 是用于类型操作的两个关键工具,常用于处理对象类型的键和属性映射。以下是它们的详细解释和用法示例:


1. keyof 关键字

作用:将对象类型的键提取为联合类型。
语法keyof T,其中 T 是对象类型。
结果:返回 T 的所有键的联合类型。

示例:
interface Person {
  name: string;
  age: number;
}

type PersonKeys = keyof Person; // "name" | "age"
典型场景:
  • 泛型约束:限制函数参数必须为对象的有效键。
    function getValue<T, K extends keyof T>(obj: T, key: K): T[K] {
      return obj[key];
    }
    
  • 映射类型的基础:结合 in 使用,生成新类型(如 Partial<T>)。
特殊情况:
  • 空对象keyof {} 结果为 never
  • 原始类型keyof string 返回 String 包装对象的属性和方法的联合类型(如 "length" | "charAt" | ...)。

2. in 关键字

作用:在映射类型中遍历联合类型的每个成员。
语法[K in T],其中 T 是联合类型。
结果:为联合类型中的每个成员生成新的属性。

示例:
type Keys = "a" | "b";
type MyObject = {
  [K in Keys]: string;
};
// 等价于 { a: string; b: string; }
典型场景:
  • 工具类型的实现:如 Partial<T>Readonly<T>
    type Partial<T> = {
      [P in keyof T]?: T[P];
    };
    
  • 动态生成类型:根据联合类型创建新对象类型。

3. keyofin 的协作

两者常结合使用,keyof 提供键的联合类型,in 遍历这些键生成新属性。

示例:
interface Config {
  id: number;
  path: string;
}

type ConfigGetters = {
  [K in keyof Config as `get${Capitalize<K>}`]: () => Config[K];
};
// 结果:
// {
//   getId: () => number;
//   getPath: () => string;
// }

4. 其他注意事项

  • 索引签名
    若对象有索引签名,keyof 会返回索引类型。
    interface StringMap {
      [key: string]: number;
    }
    type Keys = keyof StringMap; // string | number
    
  • 枚举类型
    使用 keyof typeof Enum 获取枚举的键。
    enum Direction { Up, Down }
    type DirectionKeys = keyof typeof Direction; // "Up" | "Down"
    
  • 类型保护
    in 在值空间用于检查属性存在(JavaScript 特性):
    if ("name" in obj) {
      // 类型收窄为包含 name 属性的类型
    }
    

总结

关键字作用场景示例结果
keyof提取对象键的联合类型keyof { a: 1, b: 2 }"a" | "b"
in遍历联合类型生成属性{ [K in "x"|"y"]: number }{ x: number; y: number }

掌握 keyofin 的使用,能显著提升 TypeScript 类型操作的灵活性和类型安全性。

相关文章:

  • 使用Vscode的Remote-SSH通过ssh密钥免输入密码连接远程服务器
  • Java NIO之FileChannel 详解
  • unity客户端面试高频2(自用未完持续更新)
  • Androidstudio开发,实现商品分类
  • mysql 八股
  • android开启Sys V IPC,并使用共享内存编程
  • 流影---开源网络流量分析平台(二)(功能部署--流量探针)
  • C++ 中遍历 std::map
  • 网络基础概念
  • vue在template块里使用v-for循环对象、数组及嵌套结构数据
  • Redis-01.Redis课程内容介绍
  • YO-CSA-T:基于上下文与空间注意力的实时羽毛球轨迹追踪系统解析
  • 为什么package.json里的npm和npm -v版本不一致?
  • Flutter项目之构建打包分析
  • OpenCV 图形API(4)内核 API
  • 某合约任意提取BNB漏洞
  • centos7修复漏洞CVE-2023-38408
  • 群晖(Synology)存储目录挂载到Ubuntu 22.04.3 LTS系统的详细教程
  • 左右图文布局-语雀笔记
  • 力扣DAY34 | 热100 | 合并K个升序链表
  • 一个主机可以建设多少个网站/网站流量统计查询
  • 广州番禺疫情/百度seo按天计费
  • 网站建设要求 优帮云/进入百度搜索首页
  • 池州网站建设公司/服务网站排名咨询
  • 寮步镇仿做网站/seo优化技巧
  • 带论坛的网站模板下载/百度推广怎么收费的