将 Typescript Class DTO 转换为 Fastify Swagger 的 JSON Schema

Convert Typescript Class DTO into JSON Schema for Fastify Swagger

我正在尝试将我的 DTO class (Typescript) 转换为 JSON 模式:

import { IsNumber, IsString } from 'class-validator';
import { classToPlain } from 'class-transformer';

export class TodoDTO {
    @IsNumber()
    id?: number;

    @IsString()
    name?: string;

    @IsString()
    description?: string;
}

let todo = classToPlain(TodoDTO);

console.log('todo=>', todo);

我尝试使用两个包 class-transformer 和 class-validator 来转换和验证 TodoDTO class.

在控制台中,输出为 todo=> [Function: TodoDTO]

预期输出:

"TodoDTO": {
   "type": "object",
   "properties": {
       "id": { "type": "number" },
       "name": { "type": "string" },
       "description": { "type": "string" }
    },
   "required": [ "id", "name", "description" ]
}

我正在尝试使用 TodoDTO class 作为 fastify-typescript 中的 json-schema。

欢迎提出任何建议。

我从来没有这样做过,但你可以用其他方式来执行。

使用 typed-ajv 您可以将类似 ajv 的 dsl 转换为 ts 类 和 json 架构。

例子

import { CS } from '@keplr/typed-ajv';

const TodoDTOCS = CS.Object({
  id: CS.Number(true),
  name: CS.String(false),
  description: CS.String(false),
});

type TodoDTO = typeof TodoDTOCS.type; 

// TodoDTO is the correct ts type
const todo: TodoDTO = {
 //
}

// jsonSchema will be the expected json-schema format
const jsonSchema = TodoDTOCS.getJsonSchema();

免责声明:我是 typed-ajv

的维护者之一

我使用了一个名为 class-validator-jsonschema 的库,它帮助我根据需要将 class 转换为 json-schema。

代码如下:

import { IsNumber, IsString } from 'class-validator';

export class TodoDTO {
    @IsNumber()
    id?: number;

    @IsString()
    name?: string;

    @IsString()
    description?: string;
}
import { validationMetadatasToSchemas } from 'class-validator-jsonschema';
import * as todoDtos from './todo.dto';

export { todoDtos };

export const schemas = validationMetadatasToSchemas();

console.log('schemas=>', schemas);