跳到正文

← 全部工具

免费在线工具

JSON 转 TypeScript

粘贴一段 JSON 示例,就能得到可以直接用的 TypeScript 类型。嵌套对象会各自生成命名好的 interface,数组里的多个对象合并成一个类型,部分元素缺失的键会标为可选。也可以生成 JSON Schema 或 Zod 校验。不会上传任何内容,全部在本页里运行。

字母、数字和下划线。其他字符会被清理掉。

readonly 和 interface / type 的选择只对 TypeScript 输出有效。

声明数
4
输入大小
349 B

它是怎么工作的

  • •本页先用严格的解析器读取 JSON,再给数据里的每个位置生成类型。嵌套对象会变成单独的 interface,名字取自键名并转成大驼峰(user_name 变成 UserName)。如果两个嵌套对象会重名,后一个会加上父级名字作前缀,或者加数字。
  • •数组里的所有元素会合并成一个元素类型。例如 [{"id":1,"name":"a"},{"id":2}] 会得到 id: number 和 name?: string,因为有一个元素没有 name。数组里混着不同类型时会生成联合类型,如 (string | number)[];空数组没有可参考的内容,所以是 unknown[]。
  • •类型只根据你粘贴的示例推断。示例里值为 null 的字段会写成 null,因为一个例子看不出它其他时候是什么类型,请自己改成 string | null 之类。每个元素里都有的键会被当作必填,即使真实接口有时会省略它。不是合法标识符的键(例如 "my key")会加引号。
  • •所有数字都写成 number,不区分整数。大于 9,007,199,254,740,991 的整数 JavaScript 无法精确保存,本页会列出它们,并建议改用字符串传递。日期在 JSON 里本来就是字符串,所以写成 string。
  • •嵌套超过 30 层的部分写成 unknown,输入上限是 5 MB。JSON Schema 输出遵循 2020-12 草案,只用到 $schema、type、properties、required、items 和 anyOf。Zod 输出用到 z.object、z.array、z.union、optional 和 nullable。

常见问题

会上传我的 JSON 吗?
不会。转换由本页里运行的代码完成,文本不会发送到任何地方。复制和下载也都在你的设备上完成。
为什么有的值是 null,而不是 string | null?
因为转换器只看得到你的示例。字段在示例里是 null,它能知道的就只有 null。如果这个字段有时也是字符串,可以把几份响应作为同一个数组的元素粘贴进来(一个元素里是 null、另一个里是字符串,就会得到 string | null),或者手动改类型。“值为 null 的属性设为可选”这个选项也是出于同样的原因。
可选属性是怎么判断的?
在对象数组里,只要有一个元素没有某个键,这个键就是可选的。数组之外,示例里出现的键都当作必填。同一个键在不同元素里类型不同,就会得到这些类型的联合类型。
生成的结果可以直接用吗?
请当作初稿。它描述的是你粘贴的示例,而不是整个接口。可以把几份不同的响应放进同一个数组来扩大覆盖范围,再检查名字和可选字段。要在运行时校验不可信的数据,应该用 Zod 或 JSON Schema 的输出,单靠 TypeScript 的 interface 做不到。

相关阅读