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 返回值类型。

使用方法

  1. 在左侧输入框粘贴 JSON 内容,或点击「上传」按钮选择 .json/.txt 文件,或点击「示例」加载内置样例。
  2. 点击工具栏右侧的 interface 名称按钮(或齿轮图标),自定义根 interface 名称(默认 Root)、开启可选字段/只读字段。
  3. 工具会自动转换(输入后 400ms 防抖);在右侧查看生成的 TypeScript interface 代码,CodeMirror 高亮便于阅读。
  4. 选择缩进风格(2 空格或 4 空格),调整工具栏左侧/右侧面板宽度以获得最佳查看体验。
  5. 点击「复制」将 TS 代码复制到剪贴板,或点击「下载」保存为 `${interfaceName}.ts` 文件(如 User.ts)。
  6. 将代码粘贴到项目 `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 类型判断规则
nullnullnullJSON null 直接映射为 TS null 类型
undefinedundefinedundefinedundefined 值映射为 TS undefined(仅在运行时存在)
booleantrue / falsebooleantypeof boolean 映射为 TS boolean
integer1, 100, -9999number整数和浮点数都映射为 TS number
float3.14, -0.5, 1e10number所有数字字面量映射为 number(TS 不区分整数和浮点)
string"Alice", "北京"stringtypeof 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 项目中的差异:

能力维度interfacetype 别名说明
对象类型描述✓ (首选)✓ (也支持)两者都支持,本工具生成 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 === undefinedname?: string可选字段、可缺省数据
只读字段 (readonly): 关闭(默认)name: string通用类型,字段可写
只读字段 (readonly): 开启所有字段统一处理readonly name: string不可变状态、配置、DTO、API 响应
两者都开启同时满足readonly name?: stringAPI 响应快照、可选配置

Privacy & Security

本 JSON 转 TypeScript 工具所有操作完全在你的浏览器本地完成:JSON 解析、类型推断、interface 生成全部通过浏览器 JavaScript 在客户端执行,不会通过网络向任何服务器发送 JSON 内容、上传的文件或生成的代码。文件上传使用浏览器原生 FileReader API 直接读取到内存,不经过任何中间服务。不使用 Cookie 追踪,不收集任何用户输入或使用数据。关闭或刷新页面后,所有输入和输出内容自动从内存清除。适合处理含 API 密钥、token、敏感业务数据的 JSON。

Authoritative References