NestJS中如何让Swagger正确展示数组类型DTO的嵌套属性
解决Swagger无法展示数组嵌套DTO结构的问题
问题根源
TypeScript的元数据反射机制无法自动识别数组类型中嵌套的DTO泛型参数,导致Swagger默认将数组解析为[string],但单个DTO类型能正常识别结构。
修复方案
在ProductDTO的attributes字段上,通过@ApiProperty装饰器显式指定数组的元素类型,具体实现如下:
步骤1:导入所需装饰器
确保从@nestjs/swagger导入@ApiProperty,同时保留class-validator和class-transformer的相关装饰器。
步骤2:修改ProductDTO代码
import { ApiProperty } from '@nestjs/swagger'; import { IsArray, ValidateNested } from 'class-validator'; import { Type } from 'class-transformer'; import { ProductsAttributesDTO } from './products-attributes.dto'; export class ProductDTO { // 其他字段定义... @ApiProperty({ type: () => [ProductsAttributesDTO] }) // 核心:指定数组元素为ProductsAttributesDTO @IsArray() @ValidateNested({ each: true }) @Type(() => ProductsAttributesDTO) // 配合验证/转换嵌套DTO attributes: ProductsAttributesDTO[]; }
ProductsAttributesDTO示例代码
import { ApiProperty } from '@nestjs/swagger'; import { IsNumber, IsString } from 'class-validator'; export class ProductsAttributesDTO { @ApiProperty() @IsNumber() attributeId: number; @ApiProperty() @IsString() value: string; }
关键说明
- 使用
() => [ProductsAttributesDTO]工厂函数:避免可能的循环引用问题,同时明确告知Swagger数组内元素的具体DTO类型 @Type(() => ProductsAttributesDTO):必须配合@ValidateNested({ each: true })使用,确保在请求验证和数据转换时,能正确处理数组中的每个嵌套DTO实例
内容的提问来源于stack exchange,提问作者wiliamvj
相关产品推荐
相关产品推荐

