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

NestJS中使用class-validator验证请求体中interface类型字段的方法

NestJS class-validator 嵌套数组字段校验方案

class-validator仅支持对类实例做校验,interface在TS编译后会被抹除无法被识别,所以需要按以下步骤改造:

步骤1:将Experience接口改造为校验类

把原来的Experience接口改为Class类型,并给内部字段加上对应的校验装饰器:

import { IsEnum, IsNumber, Min } from 'class-validator';

export enum Fields {
  Full_Stack_Dev = 'full stack dev',
  Frontend_Dev = 'frontend dev',
  Backend_Dev = 'backend dev',
}

export class Experience {
  @IsEnum(Fields)
  field: Fields;

  @IsNumber()
  @Min(0) // 可根据业务需求调整最小值规则
  years: number;
}

步骤2:给DTO中的experience字段添加校验装饰器

需要结合三个装饰器实现数组嵌套校验:

  • @IsArray():校验字段值是数组类型
  • @ValidateNested():触发对数组内每一个元素的校验
  • @Type():来自class-transformer包,用于将请求传入的普通对象自动转换为Experience类实例,否则嵌套校验不会生效

完整DTO代码示例:

import { IsEnum, IsArray, ValidateNested } from 'class-validator';
import { Type } from 'class-transformer';
import { Experience } from './对应的文件路径';

// 假设你已经定义了Languages枚举
export class YourDto {
  @IsEnum(Languages, { each: true }) // 数组枚举校验必须加each:true,否则只能校验单个枚举值
  languages: Languages[];

  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => Experience)
  experience: Experience[];
}

注意事项

如果你的项目全局ValidationPipe没有开启自动转换,需要在注册pipe时添加transform: true配置,否则@Type装饰器不会生效:

// main.ts 中注册全局ValidationPipe
app.useGlobalPipes(new ValidationPipe({
  transform: true,
  // 其他配置按需添加
}));

内容的提问来源于stack exchange,提问作者Karan Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:15:03