JSON 转 TypeScript 接口生成器
粘贴 JSON 数据自动推断 TypeScript 类型,生成 export interface 声明。支持联合类型合并(数组元素类型不同或同名字段类型不同时自动合并为联合)、可选字段检测(数组中对象字段不一致时标记 ?:)、嵌套对象提取为独立 interface、相同结构去重复用。递归遍历 JSON 树,纯原生 TypeScript 零依赖实现,所有数据在浏览器本地处理。
TypeScript 接口将显示在这里
常见问题
什么是 JSON 转 TypeScript?为什么需要它?
JSON 转 TypeScript 是从 JSON 数据反向推断 TypeScript 类型定义的过程。手动为 API 响应、配置文件、Mock 数据编写 interface 既繁琐又易错,本工具自动完成。常见场景:①从后端 API 响应生成前端请求函数的类型定义;②为本地 JSON 配置文件生成类型,获得编辑器自动补全;③将 Mock 数据转为类型,用于单元测试;④阅读第三方 API 返回结构。生成结果可直接粘贴到 .ts 文件中使用。
如何处理数组中元素类型不同的情况?
本工具递归合并数组所有元素的类型。当元素类型不同时合并为联合类型:①基本类型混合(如 [1, "a", true])→ (number | string | boolean)[];②对象字段类型不同(如 [{a:1}, {a:"x"}])→ { a: number | string }[];③对象字段并集(如 [{a:1}, {b:2}])→ { a?: number; b?: number }[](缺失字段标记可选)。联合类型输出稳定(按签名排序),避免每次生成结果不一致。
如何检测可选字段?
当数组中多个对象的字段不一致时,缺失的字段会被标记为可选(?:)。例如 [{id:1, name:"A"}, {id:2}] 中 name 在第二个对象缺失,生成 { id: number; name?: string }。判定规则:字段在数组所有对象中都出现 → 必选;任一对象缺失 → 可选。可在选项面板关闭「可选字段」开关,强制所有字段必选(适合字段语义上必填但部分样本缺失的场景)。注意:单个对象(非数组元素)的字段始终必选,因为 JSON 对象本身定义了完整结构。
嵌套对象如何提取为独立 interface?
为避免生成过深的嵌套类型,本工具将对象值字段提取为独立 interface 声明。例如 {user:{name:string}} 生成两个 interface:interface Root { user: User } 与 interface User { name: string }。命名规则:字段名首字母大写拼接父级名(如 Root.user → RootUser,数组元素用 RootItem)。相同结构的对象会复用同一个 interface 名(去重),避免重复声明。
interface 去重是如何工作的?
本工具基于「结构签名」对 interface 去重。签名由字段名 + 字段类型签名按字典序拼接而成,相同结构的对象视为同一类型。例如 {a:1, b:2} 与 {b:3, a:"x"} 的字段名集合相同(a 和 b),但 a 的类型不同(number vs string),签名不同,会生成两个 interface。而 {a:1} 与 {a:2} 签名相同,复用同一 interface。去重保证输出简洁,避免冗余声明。
如何处理 null 值?
JSON 中的 null 在 TypeScript 中对应 null 类型。本工具默认保留 null 为联合类型的一部分:①字段值为 null(如 "v": null)→ v: null;②数组含 null 与其他类型(如 [1, null])→ (number | null)[];③字段在不同对象中分别为值与 null(如 [{a:1}, {a:null}])→ a: number | null。可选字段开关仅控制 ?: 标记,不影响 null 合并。如需将 null 视为 undefined,可在生成后手动替换。
支持哪些 JSON 类型?
支持 JSON 规范的全部类型:①字符串 → string;②数字(整数、浮点、科学计数法)→ number;③布尔 → boolean;④null → null;⑤数组 → T[] 或 Array<T>;⑥对象 → interface。空数组元素类型推断为 any。空对象生成 interface Name {}。顶层为基本类型时输出 type Root = string 别名而非 interface。
字段名不合法时会怎样?
TypeScript 字段名需为合法标识符(字母/下划线/$ 开头,后接字母数字下划线/$),否则需用引号包裹。本工具自动检测:①合法名(如 name、_id、$ref)原样输出;②非法名(如 "my-key"、"2nd"、"a b")用 JSON.stringify 包裹为字符串字面量(如 "my-key": string)。中文键名(如 "名称")会被引号包裹,TS 允许但部分 linter 会警告。
与 JSON Schema 工具有何区别?
两者定位不同:①本工具生成 TypeScript interface 声明,用于编辑器类型检查与自动补全,是开发期类型定义;②JSON Schema 工具生成 JSON Schema(draft-07),用于运行时数据校验,是数据约束规范。例如 "age": 18,本工具输出 age: number,JSON Schema 输出 {"type":"number"}。如需运行时校验,请用 JSON Schema;如需编辑器类型提示,请用本工具。两者可结合使用:先用本工具生成类型定义,再用 JSON Schema 做运行时校验。
与 JSON / JSONPath / 格式化工具有何联动?
本工具是 JSON 工具矩阵的一员:①JSON 工具做格式化、压缩、校验、树形浏览;②JSONPath 工具做数据查询与提取;③JSON Schema 工具做运行时校验;④本工具做类型推断。典型流程:用 JSON 工具格式化压缩后的 API 响应 → 用 JSONPath 提取特定字段 → 用本工具生成 TypeScript 类型 → 用 JSON Schema 生成校验规则。所有工具共享 JSON 数据处理能力,互为补充。
数据会上传到服务器吗?
不会。本工具完全在浏览器内运行,所有类型推断、interface 生成、去重、序列化逻辑由 JavaScript 在你本地执行,输入内容不会发送到任何服务器。