TypeScript 基础指南:映射类型(Mapped Types)

映射类型(Mapped Types)是 TypeScript 中一种基于现有类型创建新类型的高级特性。它允许开发者以声明式的方式根据现有类型定义新的类型。

映射类型的基本语法如下:
{ [P in KeyType]ValueType }
在这个语法中:
P 是一个表示键的类型变量。
KeyType 是一个联合类型,定义了新类型的键。
ValueType 是新类型中每个键对应的值类型。
让我们看一个简单的例子:
interface Person {
  name: string;
  age: number;
  email: string;
}

type ReadonlyPerson = { readonly [P in keyof Person]Person[P] };
// type ReadonlyPerson = {
//   readonly name: string;
//   readonly age: number;
//   readonly email: string;
// }
在这个例子中:
1.
我们定义了一个 Person 接口,它有 name、age 和 email 三个属性。
2.
我们使用映射类型创建了一个新类型 ReadonlyPerson。
3.
keyof Person 获取了 Person 接口的所有键,组成一个联合类型 'name' | 'age' | 'email'。
4.
我们通过 [P in keyof Person] 遍历这些键,并将每个属性标记为只读。
5.
最终得到的 ReadonlyPerson 类型是一个具有只读属性的新类型。
映射类型的另一个常见用途是实现工具类型,如 Partial 和 Required:
type Partial<T> = { [P in keyof T]?: T[P] };
type Required<T> = { [P in keyof T]-?: T[P] };

interface Person {
  name: string;
  age: number;
  email?: string;
}

type PartialPerson = Partial<Person>;
// type PartialPerson = {
//   name?: string;
//   age?: number;
//   email?: string;
// }

type RequiredPerson = Required<Person>;
// type RequiredPerson = {
//   name: string;
//   age: number;
//   email: string;
// }
在这个例子中:
1.
Partial<T> 创建了一个新类型,它将 T 的所有属性都变为可选的。
2.
Required<T> 创建了一个新类型,它将 T 的所有可选属性都变为必选。
3.
我们测试了这两个工具类型,分别得到了 PartialPerson 和 RequiredPerson 类型。
映射类型的其他一些用途包括:
Record 类型
创建一个以 KeyType 为键、ValueType 为值的新对象类型。
Transform 属性
根据现有属性定义新的属性,如添加前缀、后缀等。
Recursive 映射
对复杂的嵌套对象类型进行递归映射。

总之,映射类型是 TypeScript 中一个非常强大的特性,它可以帮助开发者以声明式的方式定义新的类型,大大提高代码的灵活性和可维护性。通过合理使用映射类型,开发者可以编写出更加健壮和可扩展的代码。