为什么带有 Swagger 的 NestJS 会按要求报告我所有的 DTO 属性?

Why does NestJS with Swagger report all my DTO properties as required?

我定义了这个 DTO class。

import { ApiProperty } from "@nestjs/swagger"

export class FormDTO {
    @ApiProperty()
    id: string

    @ApiProperty()
    type: string

    @ApiProperty()
    fieldValues?: Record<string, unknown>

    @ApiProperty()
    parentFormId?: string
}

我预计生成的 OpenAPI 规范会指示 fieldValuesparentFormId 是可选的,但它们是必需的。

根据文档中的示例 here 它们应该是可选的。我错过了什么?

使用该 DTO 的唯一方法如下所示,但我认为这无关紧要:

@Post(":id")
createForm(@Body() createFormDto: FormDTO) {
    if (this.formService.hasForm(createFormDto.id)) {
        throw new ConflictException(
            undefined,
            `A form with the id ${createFormDto.id} already exists.`
        )
    }
    return this.formService.createOrUpdateForm(createFormDto)
}

如果重要,这里是 DocumentBuilder

的代码
const config = new DocumentBuilder()
    .setTitle("API")
    .setDescription(
        "description."
    )
    .setVersion("1.0")
    .addBearerAuth(
        {
            type: "http",
            scheme: "bearer",
            bearerFormat: "JWT",
            description: "Paste a valid access token here."
        },
        JWTGuard.name
    )
    .build()

因为那是 @ApiProperty() 所做的

相反,对可选字段使用 @ApiPropertyOptional()