TypeScript 映射类型简介

TypeScript 中的映射类型提供了一种通过转换现有类型来创建新类型的方法。它们是处理复杂类型操作和确保 TypeScript 应用程序中类型安全的强大工具。本文介绍了映射类型,解释了它们的语法,并提供了示例来演示它们的用法。

什么是映射类型?

映射类型允许通过对现有类型的每个属性应用转换来创建新类型。它们通常用于以灵活的方式修改或扩展类型。映射类型的基本语法是:

type MappedType = {
  [K in keyof T]: NewType;
};

在此语法中:

  • T 是原始类型。
  • K 代表 T 中的每个键。
  • NewType 是分配给每个属性的新类型。

映射类型的基本示例

这是一个映射类型的简单示例,它将给定类型的所有属性转换为只读:

type ReadOnly = {
  readonly [K in keyof T]: T[K];
};

type User = {
  name: string;
  age: number;
};

type ReadOnlyUser = ReadOnly;

在此示例中,ReadOnly 映射类型将 User 类型的所有属性转换为只读,从而产生了一个新类型 ReadOnlyUser,其中所有属性都是不可变的。

具有类型转换的映射类型

映射类型还可用于以更复杂的方式转换类型。例如,使所有属性都可选的映射类型:

type Partial = {
  [K in keyof T]?: T[K];
};

type User = {
  name: string;
  age: number;
};

type PartialUser = Partial;

在这个例子中,Partial 映射类型使 User 类型的所有属性都成为可选的,从而产生了一个新类型 PartialUser,其中每个属性都是可选的。

将映射类型与条件类型结合使用

映射类型可以与条件类型结合使用,以实现更复杂的类型操作。例如,创建仅包含特定类型的属性的类型:

type OnlyStrings = {
  [K in keyof T]: T[K] extends string ? T[K] : never;
};

type User = {
  name: string;
  age: number;
  email: string;
};

type StringProperties = OnlyStrings;

在此示例中,OnlyStrings 映射类型过滤掉了不属于 string 类型的属性,从而产生了一个新类型 StringProperties,其中仅包含来自 User 类型的字符串属性。

高级映射类型

映射类型的高级用例包括创建根据各种条件修改现有类型的类型。例如,为每个属性名称添加后缀的映射类型:

type WithSuffix<T, S extends string> = {
  [K in keyof T as `${string & K}${S}`]: T[K];
};

type User = {
  name: string;
  age: number;
};

type UserWithSuffix = WithSuffix<User, "Prop">;

在此示例中,WithSuffix 映射类型为 User 类型的每个属性名称添加后缀,从而产生一个新类型 UserWithSuffix,其中属性名称具有指定的后缀。

结论

TypeScript 中的映射类型是一种多功能功能,可让开发人员通过转换现有类型来创建新类型。通过理解和利用映射类型,开发人员可以管理复杂的类型转换并确保其 TypeScript 代码中的更高类型安全性。映射类型提供了强大的功能,可用于增强和自定义 TypeScript 应用程序中的类型定义。