You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:35:31