UTILS.
100% 浏览器内运行
📘

JSON Schema 转 TypeScript

将 JSON Schema(draft-07 或 2020-12)编译为 TypeScript 接口和类型别名,处理 required、枚举、$ref、数组和组合器。

输出

关于此工具

JSON Schema 转 TypeScript 工具可将 JSON Schema 文档编译为 TypeScript 接口和类型别名,做到流行的 json-schema-to-typescript 库所做的事,而无需安装工具链。与 JSON 示例转换器不同,此工具读取的是真正的 schema:它遍历 schema 对象,将 type:'object' 转换为一个接口,其中列在 required 中的键为非可选,其余的用 ? 标记。

一切都用 JSON.parse 和纯 JavaScript 在你的浏览器本地解析并生成,因此你的 schema 永不离开页面。带 enum 的字符串 schema 会变为字符串字面量的联合;普通的 string、number/integer、boolean 和 null 映射到它们的 TypeScript 等价类型;数组变为 T[](当 items 为数组时变为元组)。支持组合器——allOf 变为交叉类型(A & B),anyOf / oneOf 变为联合类型(A | B)——可为空的 type:[T,'null'] 变为 T | null。

引用按名称解析:指向 #/definitions/X 或 #/$defs/X 的 $ref 会输出一个命名类型引用,且每个定义都会生成为各自的 export interface 或 export type。additionalProperties 会添加索引签名 [key: string]: T。根类型名称回退为 schema 的 title 或 $id。可切换接口输出还是类型输出,以及 schema 的 description 字符串是否变为 JSDoc /** */ 注释。复制结果,或下载 .ts 文件。

常见问题

支持哪些 JSON Schema 特性?
带 properties 和 required 的 object、作为字面量联合的 string 枚举、number/integer/boolean/null、数组(包括元组)、allOf/anyOf/oneOf 组合器、指向 definitions 或 $defs 的 $ref、作为索引签名的 additionalProperties,以及像 ["string","null"] 这样的可空类型数组。
如何处理 $ref 和 definitions?
像 #/definitions/Address(或 #/$defs/Address)这样的 $ref 会变为对命名类型 Address 的引用,且 definitions 或 $defs 下的每个条目都会输出为各自的 export interface 或 export type,因此引用可在输出中解析。
根类型的名称由什么决定?
如果你设置了根名称框则用它,否则用 schema 的 title,再否则用其 $id 的最后一段,最后回退为 Root。定义名称来自它们在 definitions 或 $defs 中的键,并转换为 PascalCase。
我可以保留 schema 描述吗?
可以。开启 JSDoc(默认)后,schema 或属性上的任何 description 字符串都会作为 /** ... */ 注释输出在相应类型或字段的上方,从而在生成的 TypeScript 中保留文档。

更多工具