架构映射: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 interface,需要供 Ajv 校验或 API 网关使用的 JSON Schema。
- 某个 JSON 配置文件的结构已用 TypeScript 类型定义,你想为它发布一份 schema。
使用方法
- 粘贴 TypeScript interface 或类型别名。@minimum、@format、@pattern 等 JSDoc 标签会被读入 schema。
- 源码会提交到 /api/typescript-to-json-schema,在服务器上写入临时文件,并在公开所有类型的情况下处理。
- 复制 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"。