怎么实现自动生成typescript类型声明工具 - 开发技术

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
    本篇内容主要讲解“怎么实现自动生成typescript类型声明工具”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现自动生成typescript类型声明工具”吧!

      在TypeScript 项目中,我们经常需要使用声明一系列的ts类型。然而,手动写的效率实在太低,编写一个自动生成ts类型的工具可以解放生产力。 实现一个工具将 JSON 数据转换为 TypeScript 类型定义,从而让 TypeScript 项目更高效的开发。

      一、实现的功能

      • 将 JSON 数据转换为 TypeScript 类型定义。

      • 支持嵌套的复杂类型,如数组和对象。

      • 支持自定义类型名称和命名空间。

      • 支持将转换后的 TypeScript 类型定义保存为文件。

      二、工具使用方法

      1.在线playground使用:在线json转ts类型声明

      2.已经发布到npm:my-json-to-ts - npm (npmjs.com)

      运行效果如下动图:

      怎么实现自动生成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 文件,解析成 JSON 对象。

      • 遍历 JSON 对象,根据不同的类型生成对应的 TypeScript 类型定义字符串。

      • 如果指定了类型名称和命名空间,则在生成的 TypeScript 类型定义字符串前面添加对应的声明。

      • 如果指定了保存文件,则将生成的 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');
        /**
         * 将 JSON 数据转换为 TypeScript 类型定义
         * @param {Object} object - 要转换的 JSON 对象
         * @param {string} [name=JsonType] - 转换后的类型名称
         * @param {string} [namespace] - 转换后的命名空间
         * @returns {string} - 转换后的 TypeScript 类型定义字符串
         */
        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)
                     if (typeRes.split('|').length > 1) {
                        return `(${typeRes})[]`;
                      } else {
                        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;
        }
        /**
         * 读取文件并解析成 JSON 对象
         * @param {string} path - 文件路径
         * @returns {Promise<Object>} - JSON 对象
         */
        async function readJson(path) {
            const content = await fs.readFile(path, 'utf8');
            return JSON.parse(content);
        }
        /**
         * 将 TypeScript 类型定义字符串写入文件
         * @param {string} content - TypeScript 类型定义字符串
         * @param {string} path - 文件路径
         * @returns {Promise<void>}
         */
        async function writeTs(content, path) {
            await fs.writeFile(path, content, 'utf8');
        }
        /**
         * 将 JSON 数据转换为 TypeScript 类型定义
         * @param {string} inputPath - 输入 JSON 文件路径
         * @param {string} outputPath - 输出 TypeScript 文件路径
         * @param {string} [options.name=JsonType] - 转换后的类型名称
         * @param {string} [options.namespace] - 转换后的命名空间
         * @param {boolean} [options.noFile] - 不将 TypeScript 类型定义保存为文件
         * @returns {Promise<void>}
         */
        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);
      到此,相信大家对“怎么实现自动生成typescript类型声明工具”有了更深的了解,不妨来实际操作一番吧!这里是片云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    • 阿里云国际版折扣https://www.yundadi.com

    • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

      “怎么实现自动生成typescript类型声明工具 - 开发技术” 的相关文章

      sync,shutdown,usr

      sync:同步数据,将内存中的数据刷新到硬盘上,相当于refresh shutdown +10:系统就会10分钟后关机 文件名以.开关是的隐藏文件 usr:UNIX Software Resource...

      shell输出

      echo:一般带换行,但unix各版本间互不相同的行为模式使得echo的可移植性变得很困难,不过它仍是最简单的一种输出方式. echo hello world printf:模仿c程序库里的prinf()库程序.它几乎复制了该函数所有的功能.但如果你想换行....

      jsp导出word

      <%@ page contentType="application/vnd.ms-word; charset=utf-8"%> <%@ page pageEncoding="utf-8"%> <% String fileName = "jsp导出wor...

      CentOS 7升级gcc版本

      Centos 7默认gcc版本为4.8有时需要更高版本的这里以升级至9.3.1版本为例分别执行下面三条命令即可无需手动下载源码编译 1、安装 centos -release-scl sudo yum install centos-release-scl 列出一下...

      UVa 10892 LCM Cardinality (数论&素因子分解)

      10892 - LCM CardinalityTime limit: 3.000 secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=467&page=sh...

      怎么使用Python进行数据清洗 - 编程语言

      这篇文章主要讲解了“怎么使用Python进行数据清洗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Python进行数据清洗”吧! 缺失值当数据集中包含缺失数据时,在填充之前可以先进行...