将 Swagger 装饰器添加到 NestJS 模块以供重用

Tho*_*eil 5 node.js express typescript tsconfig nestjs

我想创建一个共享库以便在相关的 Express NestJS 应用程序中重用。为了做到这一点并获得输入/输出中嵌套对象的类型自省和示例,我正在努力维护导入的包中工作正常的信息。

这是当我直接在控制器上传递此类时在本地工作的示例。但是,当从仅导出此文件的文件运行此文件时,我丢失了示例+内省。我相信我的打字稿构建中存在错误,导致元数据/装饰器被删除,或者我的 api 文件中的嵌套构建存在问题,导致类型丢失。

我键入的响应类(缩写)在这里(在文件中或导入时相同):

  export class ExtendedRelatedSubClass extends RelatedSubClass {
    private static exampleSubClass: RelatedSubClass = getRelatedSubClassMock()
  
    @ApiProperty({ example: ExtendedRelatedSubClass.exampleSubClass.randomProp })
    public randomProp: string
  }

  export class ExtendedUserResponse extends UserResponse {
    private static exampleUser: UserResponse = getUserMock()
  
    @ApiProperty({ example: ExtendedAccountHolderResponse.exampleAccountHolder.address })
    public address: ExtendedAddressResponse = new ExtendedAddressResponse()
  
    @ApiProperty({ example: ExtendedAccountHolderResponse.exampleAccountHolder.legalInformation })
    public relatedSubClass: ExtendedRelatedSubClass = new ExtendedRelatedSubClass()
  }
Run Code Online (Sandbox Code Playgroud)

然后该类在控制器上使用,如下所示:

export const userFilteredProps = [
  'randomSubClass',
] as const

export class FilteredUserResponse extends PickType(
  ExtendedUserResponse,
  userFilteredProps
) {}

@Controller('/:market/users')
export class UsersController {
  constructor(protected readonly userService: UserService) {}

  @Get('/')
  @HttpCode(200)
  public async getUser(
    @Param() params: MarketParam,
  ): Promise<FilteredUserResponse> {
}
Run Code Online (Sandbox Code Playgroud)

我创建外部模块的尝试并没有保持示例/装饰器的完整性,并且具有此 tsconfig (当将其导入旧文件时,我完全丢失了输入和示例):

{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "target": "es2017",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true,
    "skipLibCheck": true
  },
  "include": ["src/**/*"]
}
Run Code Online (Sandbox Code Playgroud)

我的 swagger Nest-cli 文件:

{
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "entryFile": "create-swagger-app",
  "compilerOptions": {
    "plugins": [{
      "name": "@nestjs/swagger",
      "options": {
        "controllerFileNameSuffix": ".controller.ts",
        "classValidatorShim": true,
        "dtoFileNameSuffix": [".response.ts", ".request.ts"]
      }
    }]
  }
}
Run Code Online (Sandbox Code Playgroud)

从包中导出文件的方式是否存在问题?我两种都尝试过nest build,但yarn build都没有成功。

我的 Nest cli swagger 构建中是否还需要更多参数?