OpenAPI 转类型
把 OpenAPI 3.x(components.schemas)或 Swagger 2.0(definitions)里的模型定义生成 TypeScript 接口与类型别名,处理 $ref、allOf 继承、nullable、enum、数组与 additionalProperties,支持 YAML 与 JSON 输入。
浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。
生成的 TypeScript
粘贴一份 OpenAPI / Swagger 文档即可生成类型
这个工具能做什么
- 前端要调用后端接口,但后端只给了 OpenAPI / Swagger 文档:直接生成类型,省掉照着文档手写 interface 的工夫。
- 给 SDK、测试或 mock 数据生成类型定义,让编译期就能发现字段名写错、必填项漏传。
- 对比不同版本接口文档的模型定义,把生成的类型贴进项目里 diff 一下,看清结构到底改了什么。
- 把公司内部的 Swagger 2.0 老文档转成 TypeScript,逐步把 any 换成真实类型。
示例
输入
openapi: 3.0.3
components:
schemas:
Pet:
type: object
description: A pet
required: [id, name]
properties:
id: { type: integer }
name: { type: string }
tag: { type: string, nullable: true }
status: { type: string, enum: [available, pending, sold] }
friends:
type: array
items: { $ref: '#/components/schemas/Pet' }
Dog:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
required: [bark]
properties:
bark: { type: boolean }输出
/** A pet */
export interface Pet {
id: number;
name: string;
tag?: string | null;
status?: "available" | "pending" | "sold";
friends?: Pet[];
}
export interface Dog extends Pet {
bark: boolean;
}nullable 生成 `| null`,enum 生成字面量联合,required 之外的属性带 `?`;allOf 里的纯 $ref 成员变成 `extends`,内联对象成员合并进接口体。
常见问题
支持 OpenAPI 3.1 吗?
支持。3.1 里的 schema 就是 JSON Schema,本工具按同一套规则读取 components.schemas;差别只在 3.1 用 `type: ["string", "null"]` 表示可空,这种写法同样会生成 `string | null`。
allOf 是怎么处理的?
如果 allOf 的成员是纯 `$ref`,会生成 `interface X extends A, B`;如果是内联对象(带 properties),会把它的属性和 required 合并进同一个接口体;如果成员是标量或联合类型(没法 extends),则退化成 `type X = A & B` 这样的交叉类型。
$ref 能跨文件解析吗?
不能。工具只按 `$ref` 最后一段推导类型名(例如 `#/components/schemas/Pet` → `Pet`),不做文件或网络解析。所以只要引用的 schema 也在同一份文档的 components.schemas 或 definitions 里,生成的代码就是完整可编译的。
生成的代码能直接用吗?
可以。输出是标准的 interface / type 别名,没有运行时依赖。个别无法静态化的地方(例如 schema 名重名、$ref 推导不出名字)会在结果里给出提示,并把对应的类型降级为 unknown,而不会静默生成错误代码。
文档会被上传吗?
不会。解析与生成全部在浏览器里用 JavaScript 完成,页面不发起任何网络请求,断网也能用,文档内容不会被记录。
关键词:openapiopenapi 转 typescriptswaggerswagger 转 tstypescript 类型codegenapi 类型生成json schema接口定义openapi to types