映射类型 Mapped types

在构建诸如 **CRUD**(创建/读取/更新/删除)之类的功能时,在基本实体类型上构建变体通常很有用。 Nest 提供了几个执行类型转换的实用函数,使此任务更加方便。

部分

在构建输入验证类型(也称为 DTO)时,在同一类型上构建 createupdate 变体通常很有用。例如,create 变体可能需要所有字段,而 update 变体可能使所有字段都可选。

Nest 提供了 PartialType() 实用函数,使此任务更容易并最大限度地减少样板。

PartialType() 函数返回一个类型(类),其中输入类型的所有属性都设置为可选。例如,假设我们有一个 create 类型,如下所示:

ts
import { ApiProperty } from '@nestjs/swagger'

export class CreateCatDto {
  @ApiProperty()
  name: string

  @ApiProperty()
  age: number

  @ApiProperty()
  breed: string
}

默认情况下,所有这些字段都是必需的。要创建具有相同字段但每个字段都是可选的类型,请使用 PartialType() 传递类引用 (CreateCatDto) 作为参数:

ts
export class UpdateCatDto extends PartialType(CreateCatDto) {}
Hint

PartialType() 函数从 @nestjs/swagger 包导入。

Pick

PickType() 函数通过从输入类型中选择一组属性来构造新类型(类)。例如,假设我们从以下类型开始:

ts
import { ApiProperty } from '@nestjs/swagger'

export class CreateCatDto {
  @ApiProperty()
  name: string

  @ApiProperty()
  age: number

  @ApiProperty()
  breed: string
}

我们可以使用 PickType() 实用函数从此类中挑选一组属性:

ts
export class UpdateCatAgeDto extends PickType(CreateCatDto, ['age'] as const) {}
Hint

PickType() 函数从 @nestjs/swagger 包导入。

Omit

OmitType() 函数通过从输入类型中挑选所有属性,然后删除一组特定的键来构造类型。例如,假设我们从如下类型开始:

ts
import { ApiProperty } from '@nestjs/swagger'

export class CreateCatDto {
  @ApiProperty()
  name: string

  @ApiProperty()
  age: number

  @ApiProperty()
  breed: string
}

我们可以生成一个派生类型,该类型具有除 name 之外的所有属性,如下所示。在此构造中,OmitType 的第二个参数是属性名称数组。

ts
export class UpdateCatDto extends OmitType(CreateCatDto, ['name'] as const) {}
Hint

OmitType() 函数从 @nestjs/swagger 包导入。

Intersection

IntersectionType() 函数将两种类型组合成一种新类型(类)。例如,假设我们从两种类型开始,如下所示:

ts
import { ApiProperty } from '@nestjs/swagger'

export class CreateCatDto {
  @ApiProperty()
  name: string

  @ApiProperty()
  breed: string
}

export class AdditionalCatInfo {
  @ApiProperty()
  color: string
}

我们可以生成一种新类型,该类型结合了两种类型的所有属性。

ts
export class UpdateCatDto extends IntersectionType(
  CreateCatDto,
  AdditionalCatInfo,
) {}
Hint

IntersectionType() 函数从 @nestjs/swagger 包导入。

Composition

类型映射实用程序函数是可组合的。例如,以下内容将生成一个类型(类),该类型具有 CreateCatDto 类型除 name 之外的所有属性,并且这些属性将设置为可选:

ts
export class UpdateCatDto extends PartialType(
  OmitType(CreateCatDto, ['name'] as const),
) {}