JSON 转 TS 接口
JSON 转 TypeScript 接口在线工具,自动生成 TS 类型定义,支持嵌套对象递归展开、数组类型、自定义根接口名、interface/内联两种风格,本地转换不上传,完全免费
常见问题
嵌套对象会单独生成 interface 吗?
可以选。展开模式会为每个嵌套对象生成独立 interface,内联模式则直接写在父级里。
数组的类型怎么写?
支持 T[] 和 Array<T> 两种风格,按项目规范选择即可。
字段的可选标记(问号)怎么判断?
如果某个字段在数组里并不是每个元素都有,就会被推断为可选。所以样本里元素结构不一致时结果会更宽松。
关于这个工具
把一段 JSON 变成 TypeScript 类型定义。两个开关决定形态:嵌套对象选「展开」会生成独立 interface、选「内联」则写成 { a: string };数组可以用 T[] 或 Array<T>。左上角可自定义根接口名。
三个真正容易出错的地方,这里都处理了:
- 键名不是合法标识符时要加引号。
{"user-name": 1}必须生成"user-name": number;,直接写user-name: number;是语法错误 —— 很多在线工具就是在这里产出无法编译的代码。 - 可选字段靠「数组里是否都出现」来判断。
[{"id":1,"name":"a"},{"id":2}]会生成name?: string;,因为第二个元素没有 name。这是不用猜、可自动得出的判断依据:某个键在所有元素里都出现就是必填,缺一个就是可选。 - 同名但结构不同的对象不会合并。
data.address与meta.address字段不一样时,会拆成Address和Address2,而不是把后一个静默丢掉。
其他行为:数组元素类型取并集,[1,"a"] 得到 (number | string)[];空数组是 unknown[];值为 null 时类型就是 null(跟其他类型并列时会变成 string | null);根是数组时先给 type Root = Item[] 再给 interface Item。
不做的事:不推断字面量联合类型("new" | "done")—— 那需要样例覆盖到所有取值;不生成运行时校验,需要校验请用 zod / io-ts 这类库;不把结构相似的对象合并成一个类型;所有数字一律 number,如果 JSON 里有超过 2^53 的整数(比如 18 位订单号),TS 的 number 会丢精度,要在接口里自己改成 string。
还有一种「可空」要分清:name?: string 表示字段可能不存在,name: string | null 表示字段一定存在但值是 null。JSON 里的 null 属于后者,所以这里输出的是 | null。