文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

基于JS怎么将JSON数据转换为TypeScript类型声明的工具

2023-07-05 20:20

关注

这篇文章主要介绍“基于JS怎么将JSON数据转换为TypeScript类型声明的工具”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于JS怎么将JSON数据转换为TypeScript类型声明的工具”文章能帮助大家解决问题。

一、实现的功能

二、工具使用方法

安装工具:

npm install -g my-json-to-ts

运行工具:

my-json-to-ts input.json output.ts

其中 input.json 是要转换的 JSON 文件路径,output.ts 是转换后的 TypeScript 文件路径。

--name 类型名称    # 指定转换后的类型名称,默认为 JsonType
--namespace 命名空间 # 指定转换后的命名空间,默认为无
--no-file          # 不将转换后的 TypeScript 类型定义保存为文件

三、实现思路

四、使用示例

以下是将JSON 数据和转换后的 TypeScript 类型定义示例:

简单的JSON 数据

{  "name": "John",  "age": 30,  "address": {    "city": "New York",    "state": "NY"  },  "hobbies": [    "reading",    "traveling"  ]}

输出对应简单的类型定义

interface JsonType {  name: string;  age: number;  address: {    city: string;    state: string;  };  hobbies: string[];}

复杂的JSON 数据

{  "name": "John",  "age": 30,  "address": {    "city": "New York",    "state": "NY",    "postalCode": 10001  },  "friends": [    {      "name": "Jane",      "age": 28,      "address": {        "city": "Los Angeles",        "state": "CA"      }    },    {      "name": "Bob",      "age": 35,      "address": {        "city": "Chicago",        "state": "IL"      }    }  ],  "hobbies": [    "reading",    "traveling",    {      "name": "swimming",      "location": "pool"    }  ]}

输出对应复杂类型定义

interface JsonType {  name: string;  age: number;  address: {    city: string;    state: string;    postalCode: number;  };  friends: {    name: string;    age: number;    address: {      city: string;      state: string;    };  }[];  hobbies: (string | {    name: string;    location: string;  })[];}

五、具体实现代码

首先引入两个 Node.js 模块:fs-extracommanderfs-extra 是一个简化了 Node.js 文件系统模块的封装,而 commander 是一个命令行工具的库,可以方便地解析命令行参数。

接下来定义一个函数 jsonToTs,用于将 JSON 数据转换为 TypeScript 类型定义字符串。该函数采用递归的方式遍历 JSON 数据,生成对应的 TypeScript 类型定义。如果 JSON 数据是数组,则递归处理其中的每个元素;如果是对象,则递归处理其中的每个属性。最终,该函数返回一个 TypeScript 类型定义字符串。

然后定义了两个异步函数,readJsonwriteTs,分别用于读取 JSON 文件和将 TypeScript 类型定义字符串写入文件。

最后定义一个名为 jsonToTsFile 的函数,该函数接收命令行参数并将其传递给 jsonToTs 函数,然后将生成的 TypeScript 类型定义字符串保存到文件中。如果命令行参数中指定了不保存文件,则该函数将直接将 TypeScript 类型定义字符串输出到控制台。

  const fs = require('fs-extra');  const commander = require('commander');    function jsonToTs(object, name = 'JsonType', namespace) {      const getType = value => {          let typeRes = ``;          if (Array.isArray(value)) {              value.forEach(item => {                  let subType = getType(item);                  if (typeRes.split('|').indexOf(subType) < 0) {                      typeRes += subType                      typeRes += "|"                  }              })              typeRes = typeRes.substring(0, typeRes.length - 1)              return `(${typeRes})[]`;          }          if (typeof value === 'object' && value !== null) {              const props = Object.entries(value)                  .map(([key, val]) => `${key}: ${getType(val)}`)                  .join('; ');              return `{ ${props} }`;          }          return typeof value;      };      const type = getType(object);      const declaration = `interface ${name} ${type}`;      return namespace ? `namespace ${namespace} { \r\n ${declaration} \r\n}` : declaration;  }    async function readJson(path) {      const content = await fs.readFile(path, 'utf8');      return JSON.parse(content);  }    async function writeTs(content, path) {      await fs.writeFile(path, content, 'utf8');  }    async function jsonToTsFile(inputPath, outputPath, options) {      const { name, namespace, noFile } = options      try {          const object = await readJson(inputPath);          const type = jsonToTs(object, name, namespace);          if (noFile) {              console.log(type);          } else {              await writeTs(type, outputPath);              console.log(`Type definition saved to ${outputPath}`);          }      } catch (err) {          console.error(err.message);      }  }  const program = new commander.Command();  program      .arguments('<input> <output>')      .option('--no-file', 'do not save to file')      .option('-s, --namespace <namespace>', 'type namespace')      .option('-n, --name <name>', 'type name', 'JsonType')      .action(jsonToTsFile);  program.parse(process.argv);

关于“基于JS怎么将JSON数据转换为TypeScript类型声明的工具”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯