一文读懂TypeScript泛型工具类型-Record<K, T>

1. 定义

在 TypeScript 中,泛型工具类型 Record<K, T> 主要用于创建一个由给定键类型 K 映射到值类型 T 的新类型。

Record 工具类型有2个类型参数 K 和 T,其中:

  • K 表示的是:创建的新对象需要有哪些属性,属性可以只有一个,也可以有多个,多个属性时采用"联合类型"的写法
  • T 表示的是:对象属性的类型。

2. 源码

typescript 复制代码
type Record<K extends keyof any, T> = {
  [P in K]: T;
};

实现原理:

  • 上面这段代码中,使用 type 关键字来定义 Record<K extends keyof any, T> 类型,它接收两个类型参数 K 和 T。
  • 第一个参数 K extends keyof any 表示的是泛型参数 K 必须是一个能作为对象键的类型。
  • 然后,使用映射类型的语法 { [P in K]: T } 来创建一个新的类型,这里的 [P in K] 表示的是:遍历 K 中的每个键,并将其作为属性名,然后将类型 T 分配给每个属性。
  • 整段代码的含义就是:使用 Record 来创建一个新的对象类型,类型将拥有 K 中的每个键,并且每个键对应的属性值类型为 T。

下面我们先看下 Record<K, T> 的基本用法:

typescript 复制代码
type Direction = "up" | "right" | "down" | "left";
type RecordDirection = Record<RecordDirection, number>;

const direction: RecordDirection = {
  up: 1,
  right: 2,
  down: 3,
  left: 4,
};

上面这段代码中,RecordDirection 类型被定义为 Record<RecordDirection, number>,它将联合类型 "up" | "right" | "down" | "left"中的每个键作为属性,并将 number 类型作为属性值的类型,生成的 direction 对象需要符合该类型,使用 Record 创建的新类型,等同于下面的这段代码:

typescript 复制代码
type RecordDirection = {
  up: number;
  right: number;
  down: number;
  left: number;
}

3. 使用场景

3.1. 初始化对象

当你需要创建一个初始值为特定类型的属性的对象时,可以使用 Record。

typescript 复制代码
interface IPerson {
  name: string;
  age: number;
  email: string;
  gender: string;
};

type Person = Record<keyof IPerson, string>

const person: Person = {
  name: "Echo",
  age: "26",
  email: "test@123.com",
  gender: "Male",
};

上面这段代码中,我们使用 Record<keyof IPerson, string> 来创建一个新的类型 Person,其中,参数 keyof IPerson 用于获取 IPerson 类型中所有键的关键字,返回类型是联合类型:"name" | "age" | "email" | "ender",然后我们创建了一个名为 person 的对象,类型为 Person,此时,person 对象中必须具备 name、age、email 和 gender 这4个属性,同时我们也可以为每个属性提供默认值。

3.2. 枚举值管理

如果你有一个固定的枚举值列表,并且需要将每个枚举值映射为特定类型的属性,可以使用 Record。

typescript 复制代码
enum Color {
  Red = "RED",
  Green = "GREEN",
  Blue = "BLUE",
}

type ColorHexCode = Record<Color, string>;

const colorHexCode: ColorHexCode = {
  [Color.Red]: "#FF0000",
  [Color.Green]: "#00FF00",
  [Color.Blue]: "#0000FF",
};

上面这段代码中,Color 枚举定义了一些颜色常量。通过使用 Record,我们创建了 ColorHexCode 类型,将每个颜色映射为对应的十六进制代码。colorHexCode 对象存储了每个颜色常量与其相应的十六进制代码之间的映射。

4. 注意事项

使用泛型工具类型 Pick<K, T>,需要注意以下几个问题:

4.1. 属性名唯一

在使用 Record<K, T> 时,每个键应该是唯一的,不能重复。如果重复了,后面的键值对会覆盖前面的键值对。

4.2. 只能包含指定键的属性

Record<K, T> 创建的对象类型只能包含指定键的属性,不允许存在其他未定义的属性。

4.3. 可选属性会变成必选属性

Record<K, T> 创建的对象类型,如果键包含可选属性,生成的新类型的属性都是必选的。

4.4. 值类型的一致性

所有属性的属性值都应该具有相同的类型 T,否则 TypeScript 编译器会报错。

相关推荐
2301_796982142 分钟前
网页打开时,下载的文件text/html/重定向类型有什么作用?
前端·html
重生之我在20年代敲代码3 分钟前
HTML讲解(二)head部分
前端·笔记·html·web app
天下无贼!10 分钟前
2024年最新版TypeScript学习笔记——泛型、接口、枚举、自定义类型等知识点
前端·javascript·vue.js·笔记·学习·typescript·html
小白小白从不日白1 小时前
react 高阶组件
前端·javascript·react.js
Mingyueyixi1 小时前
Flutter Spacer引发的The ParentDataWidget Expanded(flex: 1) 惨案
前端·flutter
Rverdoser2 小时前
unocss 一直热更新打印[vite] hot updated: /__uno.css
前端·css
Bang邦2 小时前
使用nvm管理Node.js多版本
前端·node.js·node多版本管理
podoor2 小时前
wordpress不同网站 调用同一数据表
前端·wordpress
LJ小番茄3 小时前
Vue 常见的几种通信方式(总结)
前端·javascript·vue.js·html
黑狼传说3 小时前
前端项目优化:极致最优 vs 相对最优 —— 深入探索与实践
前端·性能优化