我对 NestJS 中的映射类型感到困惑。
文档说创建一个新类,PartialType
使其验证装饰器是可选的。
因此,我们在验证管道中使用它,就像使用原始类一样。
我想知道这是否是派生类的正常用法。我的意思是,使创建部分更新 DTO 变得容易。
如果是这样,为什么它在一个 swagger 包(或 graphql)中而不是在核心的 utils 中?
我对 NestJS 中的映射类型感到困惑。
文档说创建一个新类,PartialType
使其验证装饰器是可选的。
因此,我们在验证管道中使用它,就像使用原始类一样。
我想知道这是否是派生类的正常用法。我的意思是,使创建部分更新 DTO 变得容易。
如果是这样,为什么它在一个 swagger 包(或 graphql)中而不是在核心的 utils 中?
所以,mapped-types
Nest 实际上有 3 个: base @nestjs/mapped-types
、 one in@nestjs/swagger
和 one in @nestjs/graphql
。这些包的原因是允许开发人员定义一个基类,然后能够定义扩展该基类但使用不同装饰器进行验证/模式定义的类。这些 mixin 方法变得很有用,因为它们读取类上的现有元数据并为生成的类对其进行修改,例如使每个属性都是可选的,或者省略关键属性,例如类password
上的字段User
。
该@nestjs/mapped-types
包处理元数据class-validator
,class-transformer
是其他两个包的基础。如果元数据不存在,则元数据不会受到任何影响,并且类型是唯一更新的内容。
@nestjs/swagger
mapped-types
更新 swagger 架构元数据,以便您的 OpenAPI 规范正确显示。
同样,@nestjs/graphql
mapped-types
更新 GraphQL 模式以便 Apollo 不会在部分更新时抛出异常。
因为所有这些元数据都以不同的方式处理,并且不重叠,所以使用三种不同的方式来处理它。此外,为了帮助保持基本包较小,而不是需要其他两个包中的元数据密钥。