本章仅适用于代码优先方法。
在构建 CRUD(创建/读取/更新/删除)等功能时,在基本实体类型上构建变体通常很有用。 Nest 提供了几个执行类型转换的实用函数,使此任务更加方便。
部分
在构建输入验证类型(也称为数据传输对象或 DTO)时,在同一类型上构建 create 和 update 变体通常很有用。例如,create 变体可能需要所有字段,而 update 变体可能使所有字段都可选。
Nest 提供了 PartialType()
实用函数,使此任务更容易并最大限度地减少样板。
PartialType()
函数返回一个类型(类),其中输入类型的所有属性都设置为可选。例如,假设我们有一个 create 类型,如下所示:
@InputType()
class CreateUserInput {
@Field()
email: string
@Field()
password: string
@Field()
firstName: string
}
默认情况下,所有这些字段都是必需的。要创建具有相同字段但每个字段都是可选的类型,请使用PartialType()
传递类引用(CreateUserInput
)作为参数:
@InputType()
export class UpdateUserInput extends PartialType(CreateUserInput) {}
PartialType()
函数从@nestjs/graphql
包导入。
PartialType()
函数接受一个可选的第二个参数,该参数是对装饰器工厂的引用。此参数可用于更改应用于结果(子)类的装饰器函数。如果未指定,则子类实际上使用与 父 类(第一个参数中引用的类)相同的装饰器。在上面的示例中,我们扩展了使用 @InputType()
装饰器注释的 CreateUserInput
。由于我们希望 UpdateUserInput
也被视为使用 @InputType()
装饰,因此我们不需要传递 InputType
作为第二个参数。如果父类和子类类型不同(例如,父类使用 @ObjectType
装饰),我们将传递 InputType
作为第二个参数。例如:
@InputType()
export class UpdateUserInput extends PartialType(User, InputType) {}
Pick
PickType()
函数通过从输入类型中挑选一组属性来构造新类型(类)。例如,假设我们从如下类型开始:
@InputType()
class CreateUserInput {
@Field()
email: string
@Field()
password: string
@Field()
firstName: string
}
我们可以使用 PickType()
实用函数从此类中挑选一组属性:
@InputType()
export class UpdateEmailInput extends PickType(CreateUserInput, [
'email',
] as const) {}
PickType()
函数从 @nestjs/graphql
包导入。
Omit
OmitType()
函数通过从输入类型中挑选所有属性,然后删除一组特定的键来构造类型。例如,假设我们从如下类型开始:
@InputType()
class CreateUserInput {
@Field()
email: string
@Field()
password: string
@Field()
firstName: string
}
我们可以生成一个派生类型,该类型具有除 email
之外的所有属性,如下所示。在此构造中,OmitType
的第二个参数是属性名称数组。
@InputType()
export class UpdateUserInput extends OmitType(CreateUserInput, [
'email',
] as const) {}
OmitType()
函数从 @nestjs/graphql
包导入。
Intersection
IntersectionType()
函数将两种类型组合成一种新类型(类)。例如,假设我们从两种类型开始,例如:
@InputType()
class CreateUserInput {
@Field()
email: string
@Field()
password: string
}
@ObjectType()
export class AdditionalUserInfo {
@Field()
firstName: string
@Field()
lastName: string
}
我们可以生成一个新类型,该类型结合了两种类型的所有属性。
@InputType()
export class UpdateUserInput extends IntersectionType(
CreateUserInput,
AdditionalUserInfo,
) {}
IntersectionType()
函数从 @nestjs/graphql
包导入。
Composition
类型映射实用程序函数是可组合的。例如,以下内容将生成一个类型(类),该类型具有 CreateUserInput
类型除 email
之外的所有属性,并且这些属性将设置为可选:
@InputType()
export class UpdateUserInput extends PartialType(
OmitType(CreateUserInput, ['email'] as const),
) {}