JSON 转 TypeScript

JSON 转 TypeScript,是指把接口返回的 JSON 样本逐字段推断类型,生成能直接粘进项目的 interface 或 type 声明。嵌套对象拆成具名接口,数组元素字段归并后只在部分元素出现的标成可选(?),值为 null 的写成 T | null,与字段缺失区分开;空数组给 unknown[] 而非 any[],大整数另加精度注释。全程浏览器本地完成,JSON 不上传,免费无需注册。

声明形式
嵌套风格
null 字段
TypeScript 类型

贴入 JSON 后自动生成 TypeScript 类型。

🔒 JSON 在你的浏览器里解析生成,未上传任何服务器。推断依据是你给的样本而不是接口契约:样本没覆盖到的字段不会出现,只在部分元素里出现的字段会标成可选;仅支持标准 JSON(不支持注释、尾随逗号、JSON5)。

如何使用JSON 转 TypeScript

1

把 JSON 粘贴进左侧输入框,或点「选择文件」上传 .json / .txt(内容不上传,浏览器本地处理)。没有素材可以先点「填入示例」看效果。

2

按需设置:填根类型名(默认 Root),选 interface 还是 type、嵌套是具名拆分还是内联展开、null 字段写成 T | null 还是 T?,再决定要不要 export 前缀与 readonly 修饰。

3

右侧即时生成 TypeScript 代码,先看统计条确认接口数、字段数与可选字段数;黄色提示行会说明重复键、大整数、样本截断这类不阻断的情况。

4

JSON 有语法错误时,输入框下方直接标出第几行第几列、什么原因,你贴的内容不会被清空,右侧还留着上一版结果(标灰)方便对照。

5

确认字段与可选性无误后取走结果:点「复制全部」拿整段代码,点「下载 .ts」拿以根类型名命名的文件,点「复制根类型名」把 Root 这样的名字贴进业务代码。

关于JSON 转 TypeScript的常见问题

JSON 转 TypeScript 会上传我的数据吗
不会,JSON 转 TypeScript 不上传任何内容。解析、类型推断、代码生成与下载全部在你自己的浏览器里完成,JSON 不会离开这台设备,关闭页面即清除(页面只加载站点访问统计脚本,它不读取、也不上报你粘贴的内容)。所以拿含密钥、token、用户手机号的接口返回来生成类型也是安全的。本机存的只有生成偏好——interface 还是 type、缩进几格、要不要 readonly 这类非敏感参数;JSON 内容不会写进 localStorage,根类型名同样不存(它常带业务名或客户名)。页面加载完成之后可以断网使用,粘贴、生成、复制、下载都照常工作。
手机上能用 JSON 转 TypeScript 工具吗
可以,纯网页实现,手机浏览器打开就能用,不需要装 App、不用注册。窄屏下输入框与代码块会自动堆叠成上下两栏,代码块可以横向滚动看长类型,不会把版面挤破。手机上粘贴长 JSON 不方便的话,可以点「选择文件」直接从手机里挑一个 .json 读进来;生成完点「复制全部」,再粘进你的代码编辑器或聊天窗口即可。要注意手机上参数按钮较多,建议先确认「声明形式」和「嵌套风格」两项,其余保持默认就能得到可用的结果。
JSON 转 TypeScript 生成 interface 还是 type
默认按 JSON 转 interface 生成,一键可以切成 type X = { … } 的写法。两者在描述对象结构上几乎等价,选择标准很简单:需要被第三方声明合并(declaration merging)或者团队规范要求用 interface,就保持默认;要放进联合类型、交叉类型或写工具类型时,type 更顺手。另外还有一个 export 前缀开关:关掉之后生成裸的 interface X {},适合 JSON 转 d.ts,直接贴进全局声明文件;打开 readonly 开关则会给每个属性加 readonly,数组也会渲染成 readonly T[],适合把接口返回当成不可变数据用。
JSON 转 TypeScript 怎么判断字段是否可选
JSON 转 TS 可选字段的判定依据只有一条:「该字段在样本中出现的次数 < 样本总数」。把一个数组里的所有元素归并成同一个类型时,只在部分元素里出现的字段会标成 ?,全部元素都有的字段则是必填。要特别区分两件事:字段缺失标 ?,值为 null 写成 T | null,两者同时发生就是 key?: T | null,本工具不会把它们混为一谈(很多在线工具会把 null 直接吞成 any)。如果你更希望把 null 也当成可选,把「null 字段」切到 T? 即可。还要提醒一句:推断的是样本不是接口契约,样本没覆盖到的字段根本不会出现,多贴几条样本能显著提高准确度。
JSON 转 TypeScript 遇到空数组会生成什么
生成 unknown[] 而不是 any[],空对象 {} 生成 Record<string, unknown>,在 tsc --strict 下可以直接编译,也不会因为 any 把类型检查悄悄关掉。这是本工具与多数在线工具的一处实质差别:给 any 看起来更省事,但它会让后续所有基于该字段的取值都失去检查。如果你的老代码库还开着 noImplicitAny: false、暂时需要 any,把「空值用 unknown」开关关掉即可退回 any[] / Record<string, any>,页面上也标注了不推荐。更好的做法是补一条包含真实元素的样本,让工具直接推出元素类型。
JSON 转 TypeScript 的日期字符串会推成什么
推成 string,不会自动推成 Date。JSON 规范里根本没有日期类型,2026-08-23T10:00:00Z 在 JSON 里就是一个普通字符串,JSON.parse 出来也还是字符串——工具替你猜成 Date,生成的类型反而和运行时对不上,第一次 date.getTime() 就会炸。同理,1755936000 这样的秒级时间戳推成 number,也不会被认成时间。拿到代码后有两条常规做法:一是保留 string,在用到的地方再 new Date(iso) 转;二是把字段类型手动改成 Date,同时在解析层(fetch 之后、zod 之类的校验库或自己的 reviver)真的做一次转换,让类型和数据保持一致。要区分格式的话,可以顺手把注释写清楚是 ISO 8601 还是 yyyy-MM-dd。
JSON 转 TypeScript 的大整数会丢精度吗
会,而且是 JSON.parse 这一步就丢了:12345678901234567890 会被 IEEE754 双精度抹成 12345678901234567000。TypeScript 也没法从 JSON 字面量安全地推出 bigint,所以本工具照实生成 number,并在该字段上方加一行注释写明原文与精度风险,同时给出黄色提示。真正的解法在服务端:把雪花 ID、订单号这类大整数改用字符串传输,前端拿到的类型就该是 string。顺带一提,超安全范围的数字、0.1000000000000000000001 这类高精度小数都会触发同一条提示,不会被静默放过。
JSON 转 TypeScript 支持中文或带横线的键名吗
支持。order-id、2fa、a b、空字符串键、中文键与 emoji 键都会自动加引号写成 'order-id': string 这种形式,生成的代码在 strict 下照样编译通过。类型名那一层更谨慎些:中文或数字开头的键没法直接当类型名,工具会命名成 Item1、Item2 并在提示里写清是哪条路径被改名,你可以自行重命名。另外,键名与内置类型重名时(比如 record、date)会自动让位成 RootRecord、RootDate,避免遮蔽 Record<string, unknown> 或全局 Date;你自己填的根类型名也受同一条保护,填 Record 会生成 Record2 并明确提示,不会让生成的代码编译不过;__proto__ 这类键也按普通键处理,不会污染运行时原型。
JSON 转 TypeScript 能一次合并多条样本吗
可以,把多条样本放进一个数组粘进来即可——顶层是数组时,工具默认把全部元素归并成同一个元素类型,元素接口取根类型名加 Item(如 RootItem),并额外生成 export type Root = RootItem[] 的别名。这正是「拿一段接口返回列表推类型」的主场景:某些元素多出来的字段会被标成可选,同名字段类型不一致会求并成 string | number,不会漏掉任何一条样本里的字段。规模上限是 5000 个元素,超出会只按前 5000 个推断并明确提示,不会假装覆盖了全部数据。
JSON 转 TypeScript 工具免费吗,需要注册吗
免费,不用注册、不用登录,也没有每天几次的额度,生成的代码不加水印、不插推广注释。原因很实在:解析、类型推断、代码生成全跑在你自己的浏览器里,站方没有服务器算力成本,不需要靠注册和额度来摊。判断一个在线工具是不是真·本地处理有个简单办法——页面加载完成后断网再试一次,本页断网照样能粘贴、生成、复制、下载,说明 JSON 确实没往外发。JSON 转 TypeScript 在线版与本地脚本的差别只在于它不用装 Node 依赖,打开网页就能跑。
JSON 转 TypeScript 支持哪些格式,有大小限制吗
只接受标准 JSON(RFC 8259),粘贴文本或选 .json / .txt 文件都行,文件开头带 BOM 会自动跳过。注释、尾随逗号、单引号、未加引号的键,以及 JSON5、JSONC、NDJSON 一律按语法错误报出行列,不做静默容错——这类内容先用站内「JSON 格式化/校验」修好再回来。大小上限是单次约 100 万字符,超了会提示「JSON 过长,已拦截(上限约 1,000,000 字),请缩短后重试。」,选文件时另有 400 万字节(约 3.8 MB)的字节预检。推类型不需要全量数据,截一段字段齐全的样本就够。

JSON 转 TypeScript 推断规则对照表:八种常见分歧

同一份 JSON,不同的 JSON 转 TS 类型工具生成的结果可能差很多(英文里这类工具叫 JSON to TypeScript online、JSON to interface,口径同样不统一),分歧几乎都集中在下面这几行。这张表写明把 JSON 生成 TypeScript 接口时本工具选哪种、为什么,方便你在贴进项目前对一遍。

JSON 取值与本工具生成的 TypeScript 类型对照(默认参数)
JSON 取值本工具生成为什么这么选
"abc" / 12 / truestring / number / boolean默认不做字面量收窄,避免把一次样本当成枚举;需要时可开「推断字符串字面量联合」
nullT | null(或 T?)与「字段缺失」区分开:前者是值为空,后者是键不存在
"2026-08-23T10:00:00Z"stringJSON 没有日期类型,不替你猜 Date;要 Date 请在解析层自己转
[]unknown[]不用 any[],strict 下可直接编译,也不会悄悄关掉类型检查
{}Record<string, unknown>同上,空对象不等于 any
[1, "a"](string | number)[]元素类型求并,成员顺序固定,输出可 diff
部分元素缺 bb?: T依据是「出现次数 < 样本数」,不是靠字段名猜
12345678901234567890number + 精度注释TS 无法从 JSON 字面量安全推出 bigint,照实提示而不是假装没问题

JSON 转 TypeScript 实测算例:生成 4 个接口

下面这段是典型的列表接口返回,也是「接口返回 JSON 生成 TS 类型」最常见的形态。把它原样粘进左侧输入框(或直接点「填入示例」),默认参数下右侧统计条给出的是「接口 4 / 字段 13 / 可选 1 / 联合类型 1」。

{
  "code": 0,
  "data": {
    "user": { "id": 1001, "name": "小鹿", "vip": false },
    "orders": [
      { "orderId": "A-1", "amount": 9.9, "coupon": null, "tags": ["new"] },
      { "orderId": "B-2", "amount": 12.5, "coupon": "SALE", "tags": [], "remark": "加急" }
    ],
    "extra": {}
  }
}

生成结果(默认 interface + 具名拆分)

export interface User {
  id: number;
  name: string;
  vip: boolean;
}

export interface Order {
  orderId: string;
  amount: number;
  coupon: string | null;
  tags: string[];
  remark?: string;
}

export interface Data {
  user: User;
  orders: Order[];
  extra: Record<string, unknown>;
}

export interface Root {
  code: number;
  data: Data;
}

四个细节值得留意。其一,orders 是数组,元素类型名做了英文复数还原,叫 Order 而不是 Ordersstatusaddress 这类以 s 结尾但本来就是单数的词不会被误切。其二,第二条订单多了 remark,于是它被标成 remark?: string,而两条都有的 orderId 是必填。其三,coupon 一条是 null、一条是字符串,归并成 string | null——null 没有把类型吃掉。其四,空对象 extra 给的是 Record<string, unknown>,整段代码里一个 any 都没有,可以直接过 tsc --strict

声明顺序也是刻意的:子接口在前、根接口在最后,读代码时从下往上就是「先看整体、再看细节」。同一份输入配同一组参数,输出逐字符稳定,方便你把生成结果提交进仓库后做 diff。

JSON 转 TypeScript 的大整数为什么推成 number

雪花 ID、订单号、账号 ID 常常超出 JavaScript 的安全整数范围(2^53 - 1,即 9007199254740991)。这类值最麻烦的地方在于:它不是本工具生成类型时才出问题,而是 JSON.parse 那一步就已经把精度丢了——12345678901234567890 解析出来是 12345678901234567000,两个不同的 ID 可能变成同一个数。

TypeScript 没有办法从 JSON 字面量安全地推出 bigint(JSON 里没有 bigint 字面量,JSON.parse 也不会产出 bigint),所以本工具照实生成 number,但会在该字段上方加一行注释,并在结果区给出黄色提示:

export interface Root {
  /** 超出安全整数范围(原文 12345678901234567890),JSON.parse 会丢精度,建议服务端改用字符串 */
  id: number;
}

真正的修法在服务端:把大整数改用字符串传输,前端类型写成 id: string,比较与展示都不再有精度风险。这条提示与站内「JSON 格式化/校验」「JSON 对比」的大数字口径一致——都按字面量原文如实告知,不做数值近似,也不假装 number 存得下。

JSON 转 TypeScript 有哪些限制:五道规模上限

JSON 自动生成接口定义能做到哪一步,写清楚边界比多说几个卖点更有用。首先,推断的是样本,不是接口契约——样本没覆盖到的字段不会出现,只在部分样本里出现的字段会被标成可选,生成结果是起点而不是 Schema 权威,接口真正的可空性还得看后端文档。其次,只支持标准 JSON(RFC 8259)——注释、尾随逗号、单引号、未加引号的键,以及 JSON5 / JSONC / NDJSON 一律报错并给出行列,不做静默容错;遇到这类内容先用站内「JSON 格式化/校验」修好语法再回来。第三,不生成枚举、不生成泛型、不识别日期——JSON 里没有日期类型,2026-08-23T10:00:00Z 一律推成 string;也不推 bigint。最后,复数还原是英文启发式,datanews、拼音与中文键名可能得到不理想的类型名,可以自行重命名。

规模上有五道明确的上限,超了会给中文提示并照常输出降级结果,而不是卡死:单次最多约 100 万字符、嵌套最多 64 层、最多 500 个具名接口(超出的子对象改为内联展开)、数组最多取前 5000 个元素参与归并、字符串字面量联合最多 12 个成员(超出退回 string)。这些护栏都是为了让页面在浏览器里跑得住——所有计算都发生在你的设备上,没有服务器兜底,也正因为如此,你的 JSON 才不用上传。