怎么用
- 把 JSON 样本粘贴到左侧。样本越完整越好:数组里放几条不同的记录,能让工具看出哪些字段是可选的。
- 填写根类型的名称,例如 User、OrderResponse。
- 选择输出 TypeScript 接口还是 Zod schema。结果实时出现在右侧,可以复制或下载成 .ts 文件。
- 检查推断结果,特别是值为 null 或空数组的字段,按实际情况补全类型。
推断规则
基本类型与嵌套
JSON 的字符串、数字、true 或 false、null 分别对应 TypeScript 的 string、number、boolean、null。嵌套对象会生成单独的接口,名字取自键名并转成大驼峰:owner 对应 Owner。数组元素的接口名取单数:items 对应 Item,categories 对应 Category,boxes 对应 Box;以 ss、us 结尾的词(例如 status)保持不变。
合并数组里的对象
接口返回的数组里,经常是有的记录带某个字段、有的不带。工具会把数组里的所有对象合并成一个接口:所有元素都有的字段是必填,只在部分元素里出现的字段按 TypeScript 的写法在名字后加问号,标成可选。同一个字段在不同记录里类型不同时生成联合类型,例如 qty 有时是数字、有时是 null,就写成 number | null;数组元素类型混杂时写成 (number | string)[]。
命名冲突与复用
结构完全相同的对象复用同一个接口,不会生成一堆一样的定义。不同位置出现了同名但结构不同的对象,第二个会加数字后缀,例如 User 和 User2,生成后可以按业务含义改名。键名不是合法的 JavaScript 标识符时(例如 first-name、2fa)会加上引号。
Zod schema
选择 Zod 时,每个接口都生成一个 z.object,可选字段加 .optional(),被引用的 schema 先定义、再被使用;最后一行用 z.infer 从 schema 推出同名类型,这样类型和运行时校验只需要维护一份。使用前需要在项目里安装 zod。
示例
载入示例后,根类型填 User,得到:
export interface User {
id: number;
name: string;
email: null;
roles: string[];
orders: Order[];
}
export interface Order {
id: number;
total: number;
items: Item[];
coupon?: string;
}
export interface Item {
sku: string;
qty: number;
}两条订单里只有第二条有 coupon,所以它是可选的;第二条订单的 items 是空数组,和第一条合并后仍然是 Item[]。email 在样本里只出现了 null,工具只能推断成 null,实际上它多半应该是 string | null,这正是需要人工检查的地方。
局限
- 只能从样本推断。样本里没出现的字段、没出现过的取值类型,推断结果里都没有。
- 值为 null 的字段只能推断成 null,只有空数组的字段只能推断成 unknown[],需要手动补全。
- 不会识别日期、枚举、字符串格式:"2026-09-30" 只会是 string,"admin" 不会变成字面量类型。
- 超过 2^53 的整数在 JavaScript 里会丢精度,类型仍是 number;如果接口用字符串传大整数,样本里也会是 string。
常见问题
可选字段是怎么判断的?
看数组里的多个对象:某个字段只在部分对象里出现,就标成可选。单个对象里的字段都当作必填。
为什么有的字段类型是 null?
样本里这个字段只出现了 null,推断不出别的类型。请按实际情况改成 string | null 之类。
interface 和 Zod schema 用哪个?
只需要编译期检查就用 interface;需要在运行时校验接口返回的数据,就用 Zod schema,它还能用 z.infer 推出同样的类型。
重复的结构会生成多个接口吗?
不会。结构完全相同的对象复用同一个接口。
JSON 会上传吗?
不会,推断在浏览器里完成。