跳到主内容
UniKit

JSON 转 TypeScript

JSON 自动生成 TypeScript 接口

浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。

选项
生成的 TypeScript
export interface RootOwner {
  name: string;
  email: null;
}

export interface RootItems {
  sku: string;
  price: number;
  note?: string;
}

export interface Root {
  id: number;
  name: string;
  isActive: boolean;
  score: number;
  owner: RootOwner;
  tags: string[];
  items: RootItems[];
  meta: null;
}

结果摘要: 类型数 3 · 字段数 13 · 命名冲突 0

这个工具能做什么

  • 对接接口时把返回的 JSON 样例变成 TypeScript interface,前端马上就有类型可用,不用照着文档一个个字段抄。
  • 值为 null 的字段写成 T | null,只在部分数组元素里出现的字段用 ? 标成可选,这两点决定了调用方要不要写空值判断。
  • 键名不是合法标识符(含 -、空格等)时会写成带引号的属性名,生成的接口一定能通过编译。
  • 给 mock 数据或测试夹具补类型:勾选 readonly 可以生成不可变接口,勾选 export 可以直接放进 .d.ts 或模块里。

示例

输入

{"id":1,"name":"UniKit","tags":["a","b"]}

输出

export interface Root {
  id: number;
  name: string;
  tags: string[];
}

TypeScript 只有一种数字类型,所以整数和小数都写成 number;null 字段写成 T | null,可选字段用 ? 标记。

常见问题

为什么整数和小数都是 number?

TypeScript 的 number 就是 IEEE 754 双精度浮点,没有单独的 int 类型。想在运行时区分整数,只能靠额外的校验函数或 branded type。

可空字段和可选字段有什么区别?

值为 null 的字段生成 id: number | null(该键必须存在但值可能是 null,需要判空);只在部分数组元素里出现的键生成 id?: number(该键可能根本不存在,还要先判断键是否存在)。如果这个键在所有样例里都只是 null,会直接写成 null 类型。

数组里元素类型不一致会怎样?

会合并成联合类型,例如 [1, "a"] 得到 (number | string)[],可空元素写成 (string | null)[]。嵌套联合类型会自动加括号,保证优先级正确。

生成的接口能直接用吗?

类型是从一份样例推断出来的,只能保证这份样例合法。真实接口可能有别的分支(某字段有时是字符串有时是对象),建议对着文档检查一遍再放进项目。

我的 JSON 会被上传吗?

不会。解析和代码生成都在浏览器本地完成,不发网络请求,断网可用。

关键词:jsontypescriptinterfacejson to typescripttype inferencejson 转 typescriptJSON 转接口类型推断接口生成代码生成

同类工具