JSON 转 TypeScript

转换器

从样例 JSON 自动推断生成 TypeScript 接口,处理嵌套对象、数组合并与可选字段,可自定义根接口名,适合给后端接口补类型。嵌套对象会拆成独立接口并按结构复用命名,混合类型数组合并为联合类型。可选字段会标注为可选,根接口名可自定义。生成类型可直接粘进项目。可选字段会标注为可选。

2 个接口
JSON
TypeScript
interface Profile {
  age: number;
  city: string;
}

interface RootObject {
  id: number;
  name: string;
  active: boolean;
  roles: string[];
  profile: Profile;
  lastLogin: null;
}

关于 JSON 转 TypeScript

在 TypeScript 项目里为接口响应定义类型,是拿到 JSON 之后的第一件事。类型写错的代价比运行时错误更隐蔽:它不会报错,只会让编辑器给出错误的补全,于是错误被带到更远的地方。按真实响应生成接口定义,可以保证类型与数据一致,也省去逐个字段手打的时间。 生成原理是解析 JSON 并推断结构类型:对象映射成 interface 或 type,数组推断元素类型,字面量推断成具体的原始类型。更进一步的实现还会根据多个样本合并出联合类型,例如某字段有时是字符串有时是数字,就生成字符串或数字的联合,从而在编译期提醒调用方需要收窄类型。 使用要点:优先使用多个样本,尤其是数组为空、字段缺失、值为 null 的样本,否则会生成「过于乐观」的非空类型,编译期看起来很干净,运行时却会崩。生成的类型建议只作为起点:把业务上不应为空的字段收紧、把可空字段显式标注,并去掉样本里偶然出现的调试字段。若接口有稳定的字段集合,可考虑由 OpenAPI 之类的接口描述生成,比从响应反推更可靠。 边界与限制:JSON 没有类型信息,因此生成结果只能反映「样本里出现过的形态」。数字统一推断成数字类型,无法区分整数与浮点,也无法表达金额需要的定点精度;时间在 JSON 里只是字符串,生成结果不会自动带上日期语义,需要手工替换或在读取时转换。此外 json 中的键若是保留字或含连字符,生成的属性名需要改写成合法标识符,同时保证序列化时仍映射回原键名,这一层映射最容易在生成后被遗漏。 数据与隐私:生成类型时会接触到真实的接口响应,其中常有令牌与用户字段。本工具在浏览器内完成推断与生成,不上传样本;把生产响应粘进任何在线服务前,建议先替换掉令牌与个人标识。

从工程习惯上,建议把生成的类型放在独立目录并在文件头注明来源与生成时间,同时用注释标出「手工补充」的区域,避免下次重新生成时把人工修改覆盖掉。类型校验也不应止步于编译期:运行时的数据校验仍然必要,因为接口可能返回不符合类型定义的内容,而类型只是编译期的承诺。流行的做法是类型定义与运行时的校验模式共用同一份来源,既能减少重复,也能保证两者不会互相漂移。

上手时先用两三个不同形态的响应各生成一次,观察联合类型是否被正确推断,这一步能提前发现字段可空或类型不一致的问题。维护上,建议把生成命令写进构建脚本并在文档里说明何时需要重新生成,同时在代码评审清单里加一条「接口字段变更是否同步更新类型」,因为类型不同步不会导致编译失败,最容易被漏掉,而它恰恰会让后续开发者在错误的类型提示下写出新的问题。

实现原理

生成从样例推断结构类型:对象映射成接口、数组推断元素类型、字面量推断成具体原始类型。因为 JSON 没有类型信息,推断结果只能反映样本里出现过的形态——数字一律是数字类型,无法区分整数与浮点,也无法表达定点精度;时间在 JSON 里只是字符串。多份样本可合并成联合类型,从而在编译期提示需要收窄。

推断结果
输入{"id":1,"tags":["a"],"ok":true}
输出interface Root { id: number; tags: string[]; ok: boolean }

使用方法

  1. 打开「JSON 转 TypeScript」
  2. 选择源格式与目标格式
  3. 根据需要调整输出选项
  4. 点击「转换」按钮,结果实时显示
  5. 复制或导出结果

使用场景

  • 对接后端接口 — 把接口返回的 JSON 粘进来,立即得到可直接用于前端的类型定义,避免手写出错。
  • 生成 DTO 类型 — 为 API 请求/响应体快速生成数据传输对象类型,统一前后端字段契约。
  • 补全第三方 SDK 类型 — 第三方接口没有类型声明时,用样例响应反推一套可用的 interface。
  • Mock 数据建模 — 根据 Mock JSON 生成类型,让测试和组件 props 都有类型约束。
  • 重构旧项目 — 把散落的 any 类型用真实 JSON 还原为精确接口,提升类型安全。

常见问题

嵌套对象会怎么处理?

每个嵌套对象都会被提取为独立的命名 interface,并在父接口中引用,保持结构清晰、可复用。

数组里类型不一致怎么办?

工具会合并数组中所有元素的类型,生成联合类型(如 (string | number)[]),尽量贴合真实数据。

null 字段会推断成什么?

值为 null 时会推断为 null 类型。若你的字段可能为空,建议拿到非空样例再生成更精确的类型。

interface 和 type 有什么区别?

多数场景两者可互换。勾选「使用 type」会输出 type 别名,适合需要联合类型或交叉类型扩展的场景。

生成后还能调整吗?

当然,输出是标准 TS 代码,复制到项目后可自由重命名、加注释或改成可选字段。也可配合本站「JSON 格式化」先整理数据。

生成的字段全是可选(带 ?),是 bug 吗?

不是。当输入样本里该字段缺失、或数组为空无法判断元素结构时,工具会保守地标为可选。给一个字段齐全、数组非空的样本,输出就会变成必填。也可以手动删掉不必要的 ?,工具不做业务假设。

嵌套对象 / 数组的类型和真实接口对不上?

推断以样本为准:数组类型取第一个元素,若后端返回的元素结构不一致(多态、可空字段),推断就会偏差。补几个有代表性的样本分别转换,再手动合并成联合类型,比指望单样本准确更可靠。

怎么让数字枚举或字面量联合类型生成出来?

工具按结构推断,不知道哪些数字其实是枚举。常见做法:把所有可能值放进一个数组一起转换,得到联合类型;或生成后手动把 number 改成字面量联合。刻意保留结构信息反而会让类型不可维护。

转换后的类型文件为什么这么大?

样本里每个不同结构的对象都会生成一个独立 interface,数组里元素略有差异就会裂成多个类型。先在源头收敛数据形态(同一字段不要一会儿是字符串一会儿是对象),再转换;生成后把语义相同的类型手动合并。

广告