EN
首页 分类 JSON 转 TS 接口

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。