likes
comments
collection
share

fast-typescript-to-jsonschema 一款高效将typescript类型转换成jsonschema的工具,你值得拥有

作者站长头像
站长
· 阅读数 52

是什么

一款高效地将 typescript 类型转换成 jsonschema 的工具。

能做什么?

编译 typescript 文件以获取完整的类型信息(如必填属性、属性初始值、继承、注释),转换为 jsonschema。

为什么开发它?

估计很多小伙伴会问,“社区明明有 typescript-json-schemats-json-schema-generator这样生态更完善的库,为什么还要重复造轮子?” 答案是:在使用这些库时,发现解析速度很慢,这对于想追求完美体验的开发者来说是难以忍受的。为此,团队开发了一款使用更便捷、解析更高效的工具--fast-typescript-to-jsonschema

与社区框架对比

与社区框架 typescript-json-schema 进行对比。 很明显, typescript-json-schema 类型支持更完善,这是不可否认的。 但是,解析速度特别慢!解析速度对比见下。

解析速度对比

 fast-typescript-to-jsonschema 一款高效将typescript类型转换成jsonschema的工具,你值得拥有

ts代码fast-typescript-to-jsonschematypescript-json-schema
代码块120.13 ms1850 ms
代码块219.20 ms1760 ms
代码块320.78 ms1875 ms
代码块419.15 ms1856 ms
代码块519.55 ms1739 ms
平均耗时19.76 ms1816 ms

结论

fast-typescript-to-jsonschema 解析速度极快,解析时间仅为 typescript-json-schema1.09%,这也是我们开发这个库的初衷!

案例代码块

(1)代码块1

interface Base {
    propA: number;
}

export interface MyObject extends Base {
    propB: number;
}

(2)代码块2

export interface MyObject {
  required: string;
  optional?: number;
  [name: string]: string | number;
}

(3)代码块3

export interface MyGeneric<T> {
  field: T;
}

export interface MyObject {
  value: MyGeneric<number>;
}

(4)代码块4

type MyString = string;

type MyAlias = MySubObject;

interface MySubObject {
    propA: number;
    propB: number;
}

interface MyObject {
    primitive: MyString;
    object: MySubObject;
    alias: MyAlias;
}

(5)代码块5

// common内容如下:
// export interface AAAA {
//   age: number;
// }
import { AAAA } from "./common";

interface MyObject {
  value: AAAA;
}

快速使用案例

  • 1.安装依赖
yarn add fast-typescript-to-jsonschema -D
  • 2.创建 type.ts 文件,内容如下:
interface ITest {
  attr1: string;
  attr2: number;
  attr3?: boolean;
}
  • 3.创建 test.js 文件,内容如下:
const { default: genTypeSchema } = require('fast-typescript-to-jsonschema');
const path = require('path');

// 目标文件
const file = path.resolve(__dirname, './type.ts');

// 生成数据
genTypeSchema.genJsonDataFormFile(file);

// 获得当前文件对应的所有 jsonschema 数据
const json = genTypeSchema.genJsonData();

// 获得具体的某个 type 的 jsonschema 数据
const jsonSchema = genTypeSchema.getJsonSchema(file, 'ITest');

// 返回结果
console.log(jsonSchema); 
  • 4.执行脚本
node ./test.js

jsonSchema返回结果如下:

{
  "additionalProperties": false,
  "properties": {
    "attr1": {
      "type": "string",
    },
    "attr2": {
      "type": "number",
    },
    "attr3": {
      "type": "boolean",
    },
  },
  "required": [
    "attr1",
    "attr2",
  ],
  "type": "object",
}

更多类型解析结果请看

支持功能

  • 基础类型-布尔值、数字、字符串、数组
  • 接口-可选属性、索引类型、继承接口
  • 泛型
  • 枚举-数字枚举、字符串枚举、计算枚举
  • 高级类型-交叉类型、联合类型、类型别名
  • 工具类型-Omit、Pick、Record
  • 模块-导出、导入
  • 命名空间

待完善功能

  • 工具类型-除Omit、Pick、Record外其他工具函数

未来规划

我们致力于打造快而强的工具,目前在类型支持方面需向社区框架 fast-typescript-json-schema 对齐,并跟随 typescript 的迭代更新不断地提供新的类型支持。

总结

fast-typescript-to-jsonschema 主打的是更快、更方便地将 typescript 解析成 jsonschema。相较于 typescript-json-schema 让人诟病的解析速度太慢、多文件支持不完美等问题来看,它的确是一个很有潜力的解析库。 不过由于 fast-typescript-to-jsonschema 刚出山没多久,支持的类型没那么完善。相信随着团队以及各种开发者的共建,这些问题都会得到解决。 欢迎大家使用这个库! 如果开发者在使用上有啥问题,可以提 issue 或更改后提 PR,我们非常欢迎其他开发者的参与!

JSON Schema 应用场景

  1. 生成 JSON 格式可读文档
  2. 对数据作校验
  3. 根据 JSON Schema 生成数据采集 UI
  4. 使用 JSON Schema 生成 mock 数据

关于我们

团队隶属于明源云客前端架构团队,希望通过研发框架和研发工具改善前端开发者的体验。欢迎关注我们的 GitHub 仓库:

github.com/yunke-yunfl…

参考链接

转载自:https://juejin.cn/post/7086791350674259998
评论
请登录