如何根据后端返回的json数据快速生成ts类型📶📶📶

在前端开发中,我们通常需要处理来自后端或其他数据源的 JSON 数据。这些数据可能非常复杂,包含不同类型的属性,甚至嵌套对象和数组。为了更好地使用这些数据,我们希望将其转换为 TypeScript 类型定义,以获得类型检查和代码智能提示的好处。

起因

假设我们有一个包含混合类型的 JSON 数据文件 input.json:

json 复制代码
{
  "name": "moment",
  "age": 30,
  "hobbies": ["篮球", 7, true],
  "address": {
    "street": "二仙桥",
    "city": "陕西西安"
  }
}

我们想要将这个 JSON 数据转换为 TypeScript 类型定义,以便在 TypeScript 代码中使用它,但由于数据中包含了混合类型的数组和嵌套对象,这并不是一个简单的任务。

实现思路

为了将混合类型的 JSON 数据转换为 TypeScript 类型定义,我们需要执行以下步骤:

  1. 创建一个函数 generateTsCode,该函数将接受 JSON 数据和类型名称作为参数。

  2. 在函数内部,初始化一个 TypeScript 类型定义字符串,例如 interface MyType {.

  3. 定义一个用于处理属性值的函数 processValue,该函数将检查属性值的类型,并生成相应的 TypeScript 类型定义。

  4. 遍历 JSON 数据的属性,对每个属性调用 processValue 函数,生成相应的属性声明。

  5. 如果属性是数组,我们使用联合类型来表示不同元素的类型;如果是对象,我们递归调用 processValue 函数以处理嵌套对象;否则,我们直接生成属性的类型声明。

  6. 最后,在 TypeScript 类型定义字符串的末尾,添加 } 来结束类型定义。

  7. 返回生成的 TypeScript 类型定义字符串。

  8. 在主程序中,读取包含混合类型的 JSON 数据的文件,将其解析为 JavaScript 对象。

  9. 定义要生成的 TypeScript 类型的名称。

  10. 调用 generateTsCode 函数来生成 TypeScript 类型定义。

  11. 将生成的 TypeScript 类型定义写入文件,以供在 TypeScript 代码中使用。

代码示例

以下是完整的代码示例:

javascript 复制代码
const fs = require("fs");

// 定义一个函数,用于生成 TypeScript 类型定义
function generateTsCode(obj, typeName) {
  // 初始化 TypeScript 类型定义字符串
  let tsCode = `interface ${typeName} {\n`;

  // 定义一个处理属性值的函数
  function processValue(value, key, indent) {
    if (Array.isArray(value)) {
      // 如果属性是数组,定义联合类型数组
      tsCode += `${indent}${key}: (`;
      for (const item of value) {
        const type =
          typeof item === "number"
            ? "number"
            : typeof item === "string"
            ? "string"
            : typeof item === "boolean"
            ? "boolean"
            : "any";
        tsCode += `${type} | `;
      }
      tsCode = tsCode.slice(0, -2); // 移除最后的 " | "
      tsCode += `)[];\n`;
    } else if (typeof value === "object" && !Array.isArray(value)) {
      // 如果属性是嵌套对象,递归处理
      tsCode += `${indent}${key}: {\n`;
      processObject(value, `${indent}    `);
      tsCode += `${indent}};\n`;
    } else {
      // 否则,直接生成属性
      const type =
        typeof value === "number"
          ? "number"
          : typeof value === "string"
          ? "string"
          : typeof value === "boolean"
          ? "boolean"
          : "any";
      tsCode += `${indent}${key}: ${type};\n`;
    }
  }

  // 定义一个处理对象的函数
  function processObject(obj, indent) {
    for (const key in obj) {
      const value = obj[key];
      processValue(value, key, indent);
    }
  }

  // 调用处理对象的函数,从根对象开始生成类型定义
  processObject(obj, "  ");

  // 完成 TypeScript 类型定义字符串
  tsCode += `}\n`;

  return tsCode;
}

// 读取包含混合类型数组的 JSON 数据的文件
const jsonCode = fs.readFileSync("input.json", "utf-8");

// 将 JSON 代码解析为 JavaScript 对象
const jsonObj = JSON.parse(jsonCode);

// 定义 TypeScript 类型的名称
const typeName = "MyType";

// 调用生成 TypeScript 类型定义的函数
const tsTypeCode = generateTsCode(jsonObj, typeName);

// 将生成的 TypeScript 类型代码写入文件
fs.writeFileSync("output.ts", tsTypeCode, "utf-8");

// 输出转换完成的信息
console.log("JSON 转换为 TypeScript 类型完成!");

总结

通过上述代码示例,我们演示了如何将包含混合类型的 JSON 数据转换为 TypeScript 类型定义。这个过程涉及到定义一个处理函数,检查属性值的类型,以及递归处理嵌套对象和数组。最终,我们将生成的 TypeScript 类型定义写入文件,以供在 TypeScript 代码中使用。

通过这种方式,可以使我们更加快速地定义一个 ts 的类型,让我们有更多的时间去做业务的编码。

最后分享两个我的两个开源项目,它们分别是:

这两个项目都会一直维护的,如果你也喜欢,欢迎 star 🚗🚗🚗

相关推荐
miss38 分钟前
AI 改完不敢上线?OpenSpec 规约驱动开发实战
前端·代码规范·前端工程化
AiMan1 小时前
腾讯ima还是不可以导出左侧所有对话,只能单条导出,方法不对吗
前端
去伪存真1 小时前
并发量一高就装死?Agent 全链路“防猝死”手册
前端·agent
Moment1 小时前
AI 编程时代,聊聊我的 Mac mini 双屏桌面
前端·后端
AiMan2 小时前
先确认能不能一次把Microsofat Copilot所有内容打包一个文件导出
前端
总要学点什么2 小时前
第97篇:三维数据加载-城市建筑白模自定义着色器——让一条光带沿高度扫上去,快慢却由帧率说了算
前端·gis·webgl·cesium·着色器·空间分析·白模
上海懒图科技2 小时前
工厂厂区电子地图定位导航:厂区人车精准定位,安全合规双保障
前端·arcgis·vue
西安小哥2 小时前
端侧跑大模型,真正的门槛不在参数量:一次 596 秒到 10 秒的压缩路径复盘
前端·人工智能
陈随易3 小时前
Cloudflare 出钱,Vite 团队挑人,44 个维护者分 30 万美元
前端·后端·程序员
恋猫de小郭3 小时前
Flutter THLC 的 WebView 滚动终于从 70 FPS 提升到 120 FPS
android·前端·flutter