跳到主要内容

架构映射:TypeScript To JSON Schema — Numio

使用 ts-json-schema-generator 根据 TypeScript 类型生成 draft-07 JSON Schema。所有类型都放在 "definitions" 下;可选属性不会列入 "required",对象会带上 "additionalProperties": false。

你的请求和响应类型是 TypeScript interface,需要供 Ajv 校验或 API 网关使用的 JSON Schema。

TypeScript

JSON Schema

适用场景

  • 你的请求和响应类型是 TypeScript interface,需要供 Ajv 校验或 API 网关使用的 JSON Schema。
  • 某个 JSON 配置文件的结构已用 TypeScript 类型定义,你想为它发布一份 schema。

使用方法

  1. 粘贴 TypeScript interface 或类型别名。@minimum、@format、@pattern 等 JSDoc 标签会被读入 schema。
  2. 源码会提交到 /api/typescript-to-json-schema,在服务器上写入临时文件,并在公开所有类型的情况下处理。
  3. 复制 JSON Schema。如果输入只有一个类型,根节点还会带一个指向它的 $ref。

TypeScript

/** A product in the catalog */
export interface Product {
  /** @minimum 0 */
  price: number;
  name: string;
  tags?: string[];
}

JSON Schema (draft-07)

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$ref": "#/definitions/Product",
  "definitions": {
    "Product": {
      "type": "object",
      "properties": {
        "price": {
          "type": "number",
          "minimum": 0
        },
        "name": {
          "type": "string"
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "price",
        "name"
…

功能与限制

页面会把输入发送到服务器路由(/api/typescript-to-json-schema)进行转换,并不只在浏览器中处理。Next.js API 路由默认接受最大 1 MB 的请求体。

JSDoc 以扩展模式解析:说明注释变为 "description",@minimum 0 或 @minLength 1 之类的标签变为关键字。

interface 中的方法会被跳过。Date 变为 format 为 date-time 的 string,字面量联合类型变为 enum。

不支持 bigint,会返回 "Unknown node" 错误。Map 和 Set 按其 interface 描述,即只有一个数值 size 的对象,因此 JSON 数据请使用 Record<string, T> 或数组。

FAQ

未导出的类型也会包含吗?

会。输入中的所有类型,无论是否导出,都会加入 "definitions",彼此之间的引用使用 $ref。

可选属性和可为空的属性如何表示?

可选属性不会列入 "required"。与 null 的联合类型会变为包含 {"type": "null"} 的 anyOf。

为什么根节点有一个 $ref?

只有一个类型时,生成器会用 $ref 让根节点指向它。有多个类型时,只输出 "definitions"。

规范与参考资料