JSON 转 TypeScript 转换器

粘贴一个 API 响应,即可得到可直接使用的 TypeScript interface 或类型别名,嵌套类型、可选字段和 null 联合类型都会自动推断。

在浏览器中运行无需注册不上传任何数据

TypeScript

如何使用JSON 转 TypeScript

  1. 把 JSON 示例(例如 API 响应)粘贴到左侧输入框,或打开一个 .json 文件。
  2. 设置根类型名称(例如 User 或 ApiResponse)。
  3. 选择 interface 或 type 声明,并按需切换 export、readonly 或全部可选字段。
  4. 对于示例无法体现类型的值(例如空数组和 null),选择 unknown(更安全)或 any。
  5. 复制生成的代码,或下载为 .ts 文件。

类型是如何推断的

  • 基本类型:字符串、数字和布尔值分别映射为 string、number 和 boolean。
  • 嵌套对象会成为独立命名的 interface,采用 PascalCase 命名,因此 billing_address 会变成 BillingAddress。
  • 对象数组会合并为一个元素类型,并以单数形式命名:users 得到 User[]。在部分元素中缺失的键会变为可选(key?:)。
  • null 值会与该键出现过的其他值组合:string | null。始终为 null 的键会回退为 unknown 或 any。
  • 混合数组会变为联合数组,例如 (number | string)[]。
  • 相同的结构只声明一次并复用;结构不同但会重名的类型会加上数字后缀。
  • 不是合法标识符的键,例如 "first-name" 或 "2fa",会加上引号。

interface 与 type

对于普通的对象结构,两者几乎可以互换。interface 声明可以被扩展和合并,编译器错误信息也稍微清晰一些。type 别名还可以表达联合类型和映射类型。许多团队用 interface 定义 API 模型,其他情况用 type;按你的代码库或 linter(@typescript-eslint/consistent-type-definitions)的要求选择即可。

让示例生成更好的类型

类型的完整程度取决于示例。请粘贴包含可选字段的响应,或包含多个不同元素的数组,以便生成器检测出可选和可空的键。日期和枚举等值在 JSON 中只是普通字符串,之后需要手动收窄,例如 status: 'active' | 'disabled'。如需运行时校验,可将生成的类型与 Zod 等 schema 库配合使用。

常见问题

我的 JSON 会被上传吗?
不会。类型由你浏览器中的 JavaScript 生成。包含令牌或个人数据的 API 响应永远不会离开你的设备。
如何检测可选属性?
当同一数组中的对象拥有不同的键时,至少在一个对象中缺失的键会用 ? 标记为可选。如果只有一个对象,则所有键都是必需的,除非你勾选了全部可选。
应该使用 <code>unknown</code> 还是 <code>any</code>?
unknown 更安全:TypeScript 会要求你在使用前先收窄该值的类型。any 会关闭对该值的类型检查。只有在你打算之后再完善类型时才使用它。
为什么 ISO 日期的类型是 <code>string</code>?
JSON 没有日期类型,所以日期在传输中是字符串。如果你在解析后用 new Date() 转换它们,请在模型中把该属性改为 Date。
能处理大型或深度嵌套的 JSON 吗?
能。生成耗时与输入大小呈线性关系,并且在本地运行,因此几 MB 的响应也能在一秒内完成转换。

相关工具