JSON 转 TypeScript
免费在线 JSON 转 TypeScript 工具,将 JSON 数据自动推断为标准 TS interface 类型定义。支持嵌套对象子接口、数组联合类型、可选字段与 readonly 只读字段,2/4 空格缩进可选,纯浏览器本地处理不上传。
相关推荐
关于 JSON 转 TypeScript:把 JSON 数据自动变成 TS 类型
JSON 转 TypeScript 是把 JSON 格式的数据(JSON 对象或 JSON 数组)转换为 TypeScript interface 类型声明的过程。JSON(JavaScript Object Notation)作为 REST API、配置文件、日志的标准数据格式在前后端开发中无处不在,而 TypeScript 是 JavaScript 的超集,为代码添加了静态类型检查。开发中常常需要根据 API 返回的 JSON 写一份对应的 TS interface,手写容易出错且耗时,本工具就是要把这个过程自动化。
本工具的核心是把 JSON 对象的结构自动推断为 TypeScript interface。每个 JSON 对象的 key 变成 interface 的属性名,每个 value 的字面量类型被映射为对应的 TS 类型:字符串映射为 `string`、数字映射为 `number`、布尔映射为 `boolean`、null 映射为 `null`、数组映射为 `T[]`、嵌套对象映射为独立的子 interface。整个过程在浏览器本地完成,无需后端服务,几秒即可生成完整可用的类型定义。
类型推断是 JSON 转 TypeScript 的核心。JSON 本身只有 6 种基本类型(null、boolean、number、string、array、object),而 TypeScript 的基础类型系统包括 string、number、boolean、null、undefined、any、unknown、void、never、object、Array、T[]、联合类型 (A | B) 等。本工具的 getTsType 函数会按 value 的 typeof 和具体形式做映射:typeof null 映射为 `null`;typeof undefined 映射为 `undefined`;typeof boolean 映射为 `boolean`;typeof number 映射为 `number`;typeof string 映射为 `string`;Array.isArray() 命中时按数组处理。
嵌套对象处理是工具的关键能力。当 JSON 包含嵌套对象时,工具会递归生成独立子 interface,避免类型重复。例如 `address: { street, city }` 会生成 `RootAddress` 子 interface,主 interface 中通过 `address: RootAddress` 引用。子 interface 命名规则为「父 interface 名 + 字段名首字母大写」,保持语义清晰。processedTypes Set 用于去重,相同结构的嵌套对象只生成一次 interface。
数组类型推断有三种处理模式。第一,数组为空时生成 `any[]` 兜底(因为无法推断元素类型)。第二,所有元素类型一致时生成 `T[]` 形式(如 `string[]`、`User[]`)。第三,元素类型不一致时生成联合数组 `(A | B)[]`(如 `(string | number)[]`)。这种区分让生成的类型既准确又易读,避免不必要的 `any[]` 过度使用。
可选字段(?)是 TypeScript strict 模式下的重要特性。开启后,工具会扫描每个字段的值,如果是 null 或 undefined,就在 interface 中添加 `?` 修饰符:`name?: string` 表示该字段可缺省。这对于后端 API 返回的可选字段非常有用,避免访问 undefined 字段时的运行时错误。只读字段(readonly)则强调不可变性,生成的代码形如 `readonly id: number`,适合定义配置、状态快照、DTO 等场景。
interface vs type 别名是 TypeScript 用户的常见选择。本工具选择统一生成 interface,原因是 interface 是 TypeScript 描述对象类型的标准方式,支持声明合并(declaration merging)、implements 关键字、extends 继承,更符合 React、Vue、Angular 等主流前端项目的编码规范。type 别名在描述联合类型、交叉类型、函数类型时更强大,但对象类型首选 interface。
实时转换是工具的实用功能。用户输入 JSON 后 400ms 防抖自动触发转换,无需手动点击按钮。配合 CodeMirror 的 TypeScript 语法高亮(通过 @codemirror/lang-javascript 的 typescript: true 选项),用户可以即时看到生成的 interface,并修改输入观察输出变化。这种实时反馈显著提升了类型设计效率,尤其在快速试错时。
JSON 错误自修复提升了工具的容错性。现实中用户输入的 JSON 经常有尾随逗号、单引号、缺引号、注释等小问题。内置 tryFixJSON 函数会在 JSON.parse 失败时自动尝试修复常见错误,修复成功后会提示用户;如果仍无法解析,会在右侧显示具体错误位置和原因,引导用户修正。这一设计把工具的实用性提升了一个台阶,避免因为小错误反复手动调整。
纯前端处理是本工具的核心架构。所有 JSON 解析、类型推断、interface 生成都在浏览器 JavaScript 中执行,不向任何服务器发送数据。这种设计有两点核心好处:第一,JSON 内容可能包含用户敏感信息(API key、token、用户数据),本地处理完全消除泄露风险;第二,转换速度仅受设备 CPU 限制,1MB 以内的 JSON 几乎瞬时转换完成,无需等待网络往返。这与一些需要注册登录的在线服务相比,提供了更好的隐私保护和性能。
适用场景
- 前后端联调时前端开发拿到 Postman 导出的响应 JSON 样本,直接粘贴生成 TS 类型,再也不用翻 Swagger 文档逐字段手抄。
- 测试工程师在 Jest/Vitest 单测里复用后端真实响应 JSON,生成 interface 后给 mock 数据加上类型约束,避免 fetch 返回结构悄悄变化时断言失效。
- 运维人员从 ELK/Kibana 抓取线上错误日志中的 JSON 字符串片段,转成 interface 后接入告警规则配置,把字段名映射成可结构化查询的关键字。
- 数据分析师把 DataX/Fivetran 导出的半结构化 JSON 字段转成 TS 类型定义,交给前端做展示页时直接强类型消费,避免运行时找不到字段而崩溃。
- 接口联调发现某个字段值实为 null 被吞掉接口 200,开可选字段开关后生成 name?: string 让 strictNullChecks 立刻报错定位问题字段。
- 团队 Code Review 时把生成的 DTO 提交到 PR,CI 跑 tsc --strict 自动把 any 残留字段标红,逼迫 mock 数据补全后再合入主干。
- 用 json/format 工具把压成一行的 API 响应排版后再转 TS,避免原始压缩 JSON 里漏看某个尚未出现的可选字段。
- 产品经理调整字段后,后端把新的 MySQL 行转 JSON、丢进本工具,前端直接拿到 v2 版本对应的 interface,旧字段直接通过 interface 的 declaration merging 自然追加。
- 新人 onboarding 拿到一坨手写 any 的老代码,把示例 data.json 转换成正式 interface 后让 ESLint 立刻揪出全部 any 赋值。
- 把含尾随逗号、单引号的 mock 数据文件丢进工具,靠内置的 tryFixJSON 自动修复后顺手产出 TS 类型,省去手动到 IDE 修一遍的步骤。
- 前端做 Storybook 组件文档时,把 props 示例值 JSON 转成 interface,再粘贴到 .stories.tsx 的 type 声明里,文档和组件强类型一一对应。
- 对接企业 SSO 登录返回的嵌套 JSON(user/profile/roles 三层嵌套)转 TS,自动生成 Root、RootProfile、RootRoles 三个子接口直接用于 useUser hook 返回值类型。
使用方法
- 在左侧输入框粘贴 JSON 内容,或点击「上传」按钮选择 .json/.txt 文件,或点击「示例」加载内置样例。
- 点击工具栏右侧的 interface 名称按钮(或齿轮图标),自定义根 interface 名称(默认 Root)、开启可选字段/只读字段。
- 工具会自动转换(输入后 400ms 防抖);在右侧查看生成的 TypeScript interface 代码,CodeMirror 高亮便于阅读。
- 选择缩进风格(2 空格或 4 空格),调整工具栏左侧/右侧面板宽度以获得最佳查看体验。
- 点击「复制」将 TS 代码复制到剪贴板,或点击「下载」保存为 `${interfaceName}.ts` 文件(如 User.ts)。
- 将代码粘贴到项目 `types/` 目录或 `src/types/` 目录中,按需 import 使用。
功能特点
- 智能类型推断:自动识别 null、boolean、number、string、array、object 等 TypeScript 类型,映射为原生 TS 语法。
- 嵌套对象自动展开:为嵌套对象自动创建独立子 interface(如 RootAddress),保持类型层级清晰、避免冗余。
- 数组类型智能处理:元素类型一致生成 `T[]`,混合类型生成联合数组 `(A | B)[]`,空数组兜底为 `any[]`。
- 可选字段标记:开启后自动检测 null/undefined 字段,添加 `?` 修饰符,生成符合 TypeScript strict 模式的代码。
- 只读字段支持:开启后为所有字段添加 `readonly` 修饰符,适合不可变状态、配置、DTO 等场景。
- interface 名称自定义:根 interface 名称可配置(默认 Root),下载文件名以该名称命名(如 User.ts)。
- 2/4 空格缩进可选:工具栏一键切换 2 空格(ESLint 默认)和 4 空格缩进风格。
- 实时自动转换:输入 JSON 后 400ms 防抖自动转换,无需点击按钮;支持粘贴、文件上传、示例三种输入方式。
- JSON 错误自修复:内置 tryFixJSON 修复函数,自动处理尾随逗号、单引号、缺引号等常见语法错误。
- TypeScript 代码高亮:右侧输出使用 CodeMirror + JavaScript (TypeScript) 高亮,可读性强。
- 复制与下载:一键复制到剪贴板,或下载为标准 .ts 文件直接用于前端项目。
- 纯浏览器本地处理:所有 JSON 解析、类型推断、interface 生成都在浏览器 JavaScript 中完成,原始数据不上传。
常见问题
怎么把 JSON 转成 TypeScript interface?
把 JSON 内容粘贴到左侧输入框,工具会自动推断每个字段的类型(string、number、boolean、array、object 等),生成标准的 TypeScript interface 定义。嵌套对象会自动创建子 interface 并保持类型层级清晰。输入 400ms 后自动转换,无需手动点击。
支持生成 type 别名还是 interface?
本工具统一生成 TypeScript interface 声明(不支持 type 别名)。interface 是 TypeScript 中描述对象类型的标准方式,支持声明合并(declaration merging)和 implements 关键字,是 React、Vue、Angular 等前端项目的首选。
如何标记可选字段?
在设置中开启「可选字段(?)」后,工具会自动检测值为 null 或 undefined 的字段,并在 interface 中添加 `?` 修饰符。例如 `name?: string` 表示该字段可缺省。生成的代码符合 TypeScript strict 严格模式规范。
如何生成只读字段?
在设置中开启「只读字段(readonly)」后,所有字段会自动添加 `readonly` 修饰符,例如 `readonly id: number`。这样生成的 interface 强调不可变性,适合定义配置、状态快照或 DTO 等场景。
数组类型如何处理?
工具会分析数组元素的类型。如果所有元素类型一致,生成 `T[]` 形式(如 `string[]`);如果类型不一致,生成联合数组 `(A | B)[]` 形式(如 `(string | number)[]`);如果数组为空,生成 `any[]` 兜底。
嵌套对象会生成多个 interface 吗?
会的。每个嵌套对象都会生成独立的子 interface,命名规则为「父 interface 名 + 字段名首字母大写」。例如 Root 包含 address 对象,会同时生成 Root、RootAddress 两个 interface。子 interface 自动引用,避免类型重复定义。
interface 名称可以自定义吗?
可以。点击工具栏右侧的 interface 名称按钮(或在设置中修改),即可自定义根 interface 的名称(默认 Root)。下载的 .ts 文件也会以该名称命名(如 `User.ts`)。子 interface 的命名会基于根名称自动生成。
下载的 .ts 文件能直接用于项目吗?
可以。生成的代码符合 TypeScript 编码规范,包含完整的类型定义、嵌套 interface、联合类型推断等,可直接复制到 React、Vue、Angular 或 Node.js 项目中使用。下载文件名为 `${interfaceName}.ts`,如 User.ts。
JSON 解析失败怎么办?
如果 JSON 存在尾随逗号、缺引号、单引号代替双引号等常见错误,工具会自动调用 tryFixJSON 尝试修复。修复成功后会提示用户;如果无法修复,会在右侧显示具体错误位置和原因。可使用 2/4 空格缩进重新格式化后再尝试。
支持哪些 JSON 数据结构?
支持所有合法 JSON 数据结构:基本类型(null、boolean、number、string)、数组(一维或多维)、嵌套对象(任意深度)、混合类型数组(生成联合类型)。不支持的输入:JSON 中含函数、Symbol、undefined 等 JavaScript 特殊值(这些不是合法 JSON)。
缩进空格数可以选吗?
可以。工具栏右侧有缩进设置下拉框,支持 2 空格和 4 空格两种风格。2 空格是 ESLint/Prettier 默认风格,4 空格适合需要更宽松缩进的项目。生成的代码整体保持一致缩进,便于阅读和维护。
和 JSON Schema、Zod 等类型库有什么区别?
JSON Schema 适合运行时数据验证(API 边界、用户输入校验);Zod/yup 是 TypeScript 友好的运行时校验库,可以从 schema 反向生成 TS 类型;本工具是轻量的纯类型定义生成器,不做运行时验证,专注前端静态类型定义场景,速度更快、零依赖。
故障排查
生成的 interface 不正确怎么办?
常见原因:JSON 解析失败、嵌套对象识别错误、数组类型推断错误。解决:1) 检查 JSON 是否合法(用 JSON 格式化工具);2) 如果是嵌套对象,确认子 interface 引用关系;3) 如果是数组,确认元素类型是否一致;4) 重新生成或手动微调生成的代码。生成的 interface 是初稿,需要根据项目实际 API 调整细节。
下载的 .ts 文件在项目里编译报错?
可能原因:1) tsconfig.json 未启用 strict 模式但生成了 readonly 字段;2) 接口名与项目内其他类型冲突;3) 字段名是 TypeScript 关键字(如 `class`、`type`)。解决:调整 tsconfig 的 strict 设置、修改 interface 名称、对冲突字段加引号转义(如 `"class": string`)。
JSON 中包含嵌套数组,类型推断不对?
本工具对多维数组(如 `[[1, 2], [3, 4]]`)会递归处理,最终生成 `number[][]`。如果嵌套数组元素类型不一致,工具会生成 `((A | B)[])[]` 形式。空数组始终生成 `any[]`,因为无法推断元素类型。
null 值被映射为 `null` 类型而不是可选字段?
默认情况下,工具会把 JSON 中的 null 值映射为 TS 的 `null` 类型(如 `middleName: null`)。如果希望生成可选字段(`middleName?: string`),需要:1) 开启「可选字段」选项(推荐);2) 或者将 JSON 中的 null 值改为字段缺失;3) 或者在生成后手动将 `null` 改为 `string | null` 或 `?`。
interface 名称和下载文件名不一致?
两者在工具中是同一个值,由「interface 名称」设置控制(默认 Root)。下载的文件名就是 `${interfaceName}.ts`。如果两者看起来不一致,请检查是否有多个 Tab 打开导致设置不同步。建议修改设置后重新生成一次。
生成的代码有大量 `any` 类型?
可能原因:1) JSON 包含无法识别的类型(实际是 object 但被解析错误);2) 数组为空导致 any[] 兜底;3) 字段值是 null 且未开启可选字段。解决:检查 JSON 数据的完整性、补充示例数据让工具推断更精确、对始终为空的数组手动指定类型(如 `User[]`)。
想要把生成的 interface 和现有类型合并?
TypeScript interface 支持声明合并(declaration merging),同名 interface 会自动合并属性。只需在项目中创建同名 interface 并 export,然后合并:例如工具生成 `export interface User { id: number }`,你在项目中写 `export interface User { name: string }`,两者会自动合并为 `{ id: number; name: string }`。
术语表
- JSON (JavaScript Object Notation)
- 轻量级数据交换格式,基于 JavaScript 对象语法但独立于编程语言。支持对象 ({}), 数组 ([]), 字符串, 数字, 布尔, null 六种基本类型。广泛用于 REST API、前后端数据传输、配置文件、日志等场景。
- TypeScript
- 由 Microsoft 开发的 JavaScript 超集,为 JavaScript 添加了静态类型定义、接口、泛型等特性。TypeScript 代码会被编译为纯 JavaScript 后运行于浏览器或 Node.js。是 React、Vue、Angular 等现代前端项目的首选语言。
- interface(接口)
- TypeScript 中描述对象类型的关键字,语法为 `interface Name { prop: type; }`。支持声明合并(同名 interface 自动合并)、implements(类实现接口)、extends(接口继承)。是 TypeScript 描述对象形状的主要方式。
- type 别名
- TypeScript 中给类型起别名的关键字,语法为 `type Name = ...`。可用于定义联合类型 (`A | B`)、交叉类型 (`A & B`)、函数类型等。比 interface 更灵活但不支持声明合并。本工具统一使用 interface 而非 type。
- 类型推断(Type Inference)
- 本工具根据 JSON value 的 typeof 和具体形式自动决定对应 TS 类型的过程。例如 typeof string 映射为 string,Array.isArray() 命中时按数组处理,typeof object 命中时生成独立子 interface。
- 可选字段(?)
- TypeScript 中表示字段可缺省的修饰符。`name?: string` 表示 name 字段可不存在(值为 undefined)。开启本工具的「可选字段」选项后,值为 null 或 undefined 的字段会自动添加 `?`。
- 只读字段(readonly)
- TypeScript 中表示字段不可变的修饰符。`readonly id: number` 表示 id 字段在对象创建后不能被重新赋值。开启本工具的「只读字段」选项后,所有字段会自动添加 `readonly`。
- 联合类型(Union Type)
- TypeScript 中表示值可以是多种类型之一的语法,写作 `A | B`。本工具在数组元素类型不一致时使用,如 `(string | number)[]` 表示数组元素可能是 string 或 number。
- 数组类型(Array Type)
- TypeScript 中表示数组的语法,有两种形式:泛型形式 `Array<T>` 和简写形式 `T[]`。本工具统一使用简写形式。本工具有三种数组类型生成模式:一致类型 `T[]`、混合类型 `(A | B)[]`、空数组 `any[]`。
- 嵌套接口(Nested Interface)
- 在 interface 中引用其他 interface 形成类型层级。本工具为每个嵌套对象生成独立子 interface,主 interface 通过属性名引用。如 Root 引用 RootAddress,RootAddress 可以独立被其他类型引用。
- TypeScript strict 模式
- TypeScript 编译器的严格模式,包含 noImplicitAny、strictNullChecks、strictFunctionTypes 等多个子选项。开启 strictNullChecks 后,null 和 undefined 是独立类型,不能赋给其他类型变量。本工具生成的可选字段与 strict 模式完全兼容。
- DTO (Data Transfer Object)
- 数据传输对象,用于在不同层(如 API 与 Service 层)之间传递数据。在 TypeScript 项目中通常用 interface 描述,配合 readonly 强调不可变性。本工具是生成 DTO 类型定义的常用工具。
- 声明合并(Declaration Merging)
- TypeScript interface 的特性:同名 interface 会自动合并属性。常用于扩展第三方库的类型定义。本工具生成的 interface 支持与项目中其他同名 interface 合并,便于渐进式类型扩展。
- tsconfig.json
- TypeScript 项目的配置文件,位于项目根目录。包含 compilerOptions(target、module、strict 等)、include、exclude 等设置。本工具生成的 .ts 文件可以放入任何标准 tsconfig 项目中使用。
- tryFixJSON
- 本工具内置的 JSON 修复函数,会自动处理尾随逗号、单引号代替双引号、缺引号的 key、注释等常见 JSON 语法错误。在 JSON.parse 失败时自动调用,修复成功后会通知用户并继续转换。
JSON 类型到 TypeScript 类型的映射规则
本工具的 getTsType 函数根据 JSON value 的形式推断 TypeScript 类型的完整规则:
| JSON 值 | 示例 | TypeScript 类型 | 判断规则 |
|---|---|---|---|
null | null | null | JSON null 直接映射为 TS null 类型 |
undefined | undefined | undefined | undefined 值映射为 TS undefined(仅在运行时存在) |
boolean | true / false | boolean | typeof boolean 映射为 TS boolean |
integer | 1, 100, -9999 | number | 整数和浮点数都映射为 TS number |
float | 3.14, -0.5, 1e10 | number | 所有数字字面量映射为 number(TS 不区分整数和浮点) |
string | "Alice", "北京" | string | typeof string 映射为 TS string |
empty array | [] | any[] | 空数组无法推断元素类型,兜底为 any[] |
homogeneous array | [1, 2, 3] | T[] (如 number[]) | 元素类型一致时生成单一数组类型 |
mixed array | [1, "a"] | (A | B)[] (如 (number | string)[]) | 元素类型不一致时生成联合数组类型 |
object | {a: 1, b: "x"} | SubInterface(如 Root) | 嵌套对象生成独立子 interface 并引用 |
interface vs type 别名对比
本工具选择生成 interface 而非 type 别名的原因,以及两者在 TypeScript 项目中的差异:
| 能力维度 | interface | type 别名 | 说明 |
|---|---|---|---|
| 对象类型描述 | ✓ (首选) | ✓ (也支持) | 两者都支持,本工具生成 interface |
| 声明合并 | ✓ (同名自动合并) | ✗ (重复声明会报错) | interface 支持渐进式扩展,type 不行 |
| implements/extends | ✓ (类可 implements) | △ (仅对象 type 可被 implements) | interface 在 OOP 场景更自然 |
| 联合类型 (A | B) | ✗ | ✓ | type 描述联合类型更简洁 |
| 交叉类型 (A & B) | ✗ | ✓ | type 描述交叉类型更简洁 |
| 函数类型 | △ (需要 call signature) | ✓ (直接定义) | type 定义函数类型更直观 |
| 性能(大量类型时) | 略快 | 略慢 | interface 在编译时增量合并更快 |
| 本工具选择 | ✓ 统一使用 | ✗ | 本工具专注对象类型,interface 是最佳选择 |
可选字段与只读字段的生成规则
本工具的两个开关选项对生成代码的影响和最佳使用场景:
| 选项 | 触发条件 | 生成语法 | 最佳使用场景 |
|---|---|---|---|
| 可选字段 (?): 关闭 | (默认) | name: string | 所有字段必填,类型严格 |
| 可选字段 (?): 开启 | value === null || value === undefined | name?: string | 可选字段、可缺省数据 |
| 只读字段 (readonly): 关闭 | (默认) | name: string | 通用类型,字段可写 |
| 只读字段 (readonly): 开启 | 所有字段统一处理 | readonly name: string | 不可变状态、配置、DTO、API 响应 |
| 两者都开启 | 同时满足 | readonly name?: string | API 响应快照、可选配置 |
Privacy & Security
本 JSON 转 TypeScript 工具所有操作完全在你的浏览器本地完成:JSON 解析、类型推断、interface 生成全部通过浏览器 JavaScript 在客户端执行,不会通过网络向任何服务器发送 JSON 内容、上传的文件或生成的代码。文件上传使用浏览器原生 FileReader API 直接读取到内存,不经过任何中间服务。不使用 Cookie 追踪,不收集任何用户输入或使用数据。关闭或刷新页面后,所有输入和输出内容自动从内存清除。适合处理含 API 密钥、token、敏感业务数据的 JSON。
Authoritative References
- TypeScriptTypeScript interface 官方文档
- TypeScriptTypeScript 入门手册
- MDNJSON 规范 - MDN Web Docs
- TypeScriptTypeScript Playground 在线试用
- TypeScripttsconfig.json 配置参考
- ZodZod - TypeScript 优先的 schema 验证库
- JSON 压缩
- CSV 转 JSON
- JSON 转 CSV
- JSON Diff
- JSON Escape / Unescape
- JSON扁平化
- JSON 格式化
- JSON 生成器
- JSONPath 查询
- JSON 合并
- JSON 修复
- JSON Schema 校验
- JSON 排序
- JSON Stringify
- JSON 转 HTML
- JSON 转 Java
- JSON 转 Markdown
- JSON 转 SQL
- JSON 转 TOML
- JSON 转 TypeScript
- XML 转 JSON
- JSON 转 XML
- YAML 转 JSON
- JSON 转 YAML
- JSON 转 Python
- JSON 转 Go
- JSON 转 Rust
- JSON 转 Swift
- JSON 转 C#
- JSON 转 C++
- JSON 转 PHP