JSON 转 TypeScript 转换器
粘贴一个 API 响应,即可得到可直接使用的 TypeScript interface 或类型别名,嵌套类型、可选字段和 null 联合类型都会自动推断。
在浏览器中运行无需注册不上传任何数据
TypeScript
如何使用JSON 转 TypeScript
- 把 JSON 示例(例如 API 响应)粘贴到左侧输入框,或打开一个
.json文件。 - 设置根类型名称(例如
User或ApiResponse)。 - 选择
interface或type声明,并按需切换export、readonly或全部可选字段。 - 对于示例无法体现类型的值(例如空数组和 null),选择
unknown(更安全)或any。 - 复制生成的代码,或下载为
.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 的响应也能在一秒内完成转换。