NestJS PartialType对UpdateDto嵌套布尔字段失效问题求助
问题:NestJS PartialType处理嵌套布尔字段可选性失效
在使用NestJS的PartialType继承CreateDto生成UpdateDto时,遇到嵌套对象中的布尔字段未被设置为可选的问题,提交更新请求时触发以下验证错误:
"messages": [ "utilities.sprinklerSystem must be a boolean value", "utilities.sumpPump must be a boolean value", "utilities.sumpPit must be a boolean value", "utilities.water must be a boolean value", "utilities.gas must be a boolean value", "utilities.electric must be a boolean value" ]
按照PartialType的定义,它应当将输入类型的所有属性设为可选,但仅嵌套对象中的布尔类型字段未生效。需求是复用CreateDto,避免手动编写UpdateDto。
相关代码
CreateDto 代码
class PoolDTO { @IsBoolean() present: boolean; @IsOptional() @IsString() fence: string; @IsOptional() @IsString({ each: true }) location: string; } class UtilitiesDTO { @IsBoolean() sprinklerSystem: boolean; @IsBoolean() sumpPump: boolean; @IsBoolean() sumpPit: boolean; @ValidateNested() @Type(() => PoolDTO) pool: PoolDTO; @IsBoolean() spaHot: boolean; @IsBoolean() water: boolean; @IsBoolean() gas: boolean; @IsBoolean() electric: boolean; @IsOptional() @IsString() comment: string; } export class CreateDto{ @IsString() @IsNotEmpty() number: string; @ValidateNested() @Type(() => PoolDTO) pool: PoolDTO; @ValidateNested({ each: true }) @Type(() => UtilitiesDTO) utilities: UtilitiesDTO; }
UpdateDto 代码
import { PartialType } from '@nestjs/mapped-types'; import { CreateDto } from './create.dto'; export class UpdateDto extends PartialType(CreateDto) {}
问题原因
PartialType仅会将顶层属性标记为可选,但不会递归处理嵌套对象内部的属性。嵌套的PoolDTO和UtilitiesDTO类本身仍保留着原有的必填校验规则(比如布尔字段的@IsBoolean()未被标记为@IsOptional()),因此在更新请求中如果未传递这些嵌套布尔字段,就会触发验证错误。
解决方案
为嵌套的DTO类生成对应的Partial版本,然后在UpdateDto中覆盖嵌套属性的类型,确保内部字段也变为可选:
- 生成嵌套DTO的Partial版本
import { PartialType } from '@nestjs/mapped-types'; class PartialPoolDTO extends PartialType(PoolDTO) {} class PartialUtilitiesDTO extends PartialType(UtilitiesDTO) {}
- 修改UpdateDto,指定嵌套属性为Partial版本
import { PartialType } from '@nestjs/mapped-types'; import { CreateDto } from './create.dto'; import { ValidateNested, Type } from 'class-validator'; export class UpdateDto extends PartialType(CreateDto) { @ValidateNested() @Type(() => PartialPoolDTO) pool?: PartialPoolDTO; @ValidateNested({ each: true }) @Type(() => PartialUtilitiesDTO) utilities?: PartialUtilitiesDTO; }
这样既复用了CreateDto的结构,又让嵌套对象的所有字段都变为可选,符合更新场景的需求。
内容的提问来源于stack exchange,提问作者jaswant patel
相关产品推荐
相关产品推荐

