NestJs Swagger:如何为动态类定义 Api 属性

Posted

技术标签:

【中文标题】NestJs Swagger:如何为动态类定义 Api 属性【英文标题】:NestJs Swagger: How to define Api Property for dynamic classes 【发布时间】:2021-11-14 16:59:21 【问题描述】:

我有以下课程

export class DocumentsSteps 
    @ApiProperty(type: ???)
    [type: string]: DocumentStep;


我应该如何定义 ApiProperty 类型?

【问题讨论】:

【参考方案1】:

你可以用函数包装它

export type Constructor<I> = new (...args: any[]) => I

function ErrorDto(statusCode: number, message: string): Constructor<Error>
  class Error implements Error
    @ApiProperty( example: statusCode )
    readonly statusCode: number

    @ApiProperty( example: message )
    readonly message: string

  
  return Error

export class UnauthorizedErrorDto extends ErrorDto(401, 'Unauthorized')
export class BadRequestErrorDto extends ErrorDto(400, 'Bad Request')

【讨论】:

【参考方案2】:

截至目前(2021 年 9 月 21 日),这在 Nest 的 @nestjs/swagger 库中是不可能的,因为没有字段可以反映元数据。 open a pull request 可能有机会允许在库中使用 dictionaries,但现在最好的办法是修改 Nest 生成的 swagger 文档并在此时自行添加它

【讨论】:

能否请您在这里添加一个关于手动更改的小示例,它应该是什么样子【参考方案3】:

看看这个

https://docs.nestjs.com/custom-decorators#decorator-composition

您可以实现另一个装饰器来扩展 ApiProperty

export function CustomApiProperty(type: string) 
  return applyDecorators(
    ApiProperty(type, ...),
  );

【讨论】:

以上是关于NestJs Swagger:如何为动态类定义 Api 属性的主要内容,如果未能解决你的问题,请参考以下文章

NestJs Swagger 混合类型

NestJs/swagger:定义没有 DTO 类的引用模式

“nestjs/swagger”中的哪个函数将 DTO 转换为 Swagger 模型定义?

NestJS/swagger:ApiExtraModel 期望啥模型作为参数?

Nestjs Swagger UnhandledPromiseRejectionWarning:TypeError:无法解构“未定义”或“空”的属性“原型”

如果不单独使用,nestjs/swagger 是不是支持查询参数的文档?