如何用Class Validator在TypeScript中限制对象数组字段长度?
解决方案
要实现对象数组中每个元素的name字段长度在1-100字符的验证,需结合class-validator的嵌套验证能力与class-transformer的类型转换支持,具体修改如下:
步骤1:补充必要导入
首先添加缺失的验证与类型转换装饰器:
import { ApiProperty } from '@nestjs/swagger' import { Length, ValidateNested } from 'class-validator' import { Type } from 'class-transformer' // 新增类型转换装饰器导入 import { Column, PrimaryGeneratedColumn } from 'typeorm' import { MaxLenPostFolderName } from './createPostFolder.dto'
步骤2:修正单个对象的验证规则
在RenamePostFolder类的name字段上添加正确的@Length验证(无需each选项,因为name是单个字符串而非数组):
class RenamePostFolder { @ApiProperty() @PrimaryGeneratedColumn() id: number @ApiProperty({ description: 'post folder name' }) @Column({ type: 'varchar', length: MaxLenPostFolderName, nullable: false }) @Length(1, MaxLenPostFolderName, { message: '文件夹名称长度必须在1到$constraint2字符之间' // 可选:自定义错误提示 }) name: string }
步骤3:给数组字段启用嵌套验证
在RenamePostFolderDtoV2的postFolders字段上,添加嵌套验证与类型指定装饰器:
export class RenamePostFolderDtoV2 { @ApiProperty({ required: true, type: [RenamePostFolder] }) @ValidateNested({ each: true }) // 遍历数组验证每个元素 @Type(() => RenamePostFolder) // 指定数组元素的类类型,确保验证器能识别规则 postFolders: RenamePostFolder[] }
关键说明
@ValidateNested({ each: true }):触发数组的嵌套验证逻辑,确保每个数组元素都被单独校验@Type(() => RenamePostFolder):让class-transformer将传入的普通JSON对象转换为RenamePostFolder类实例,保证class-validator能读取类上的验证规则- 直接在
RenamePostFolder的name字段上定义@Length,即可确保所有数组元素的name符合1-100字符的要求
修改完成后,你提供的示例数组会被判定为合法,而长度超出范围的name会触发验证错误。
内容的提问来源于stack exchange,提问作者beeeeeeginer
相关产品推荐
相关产品推荐

