fast-typescript-to-jsonschema 一款高效将typescript类型转换成jsonschema的工具,你值得拥有
是什么
一款高效地将 typescript 类型转换成 jsonschema 的工具。
能做什么?
编译 typescript 文件以获取完整的类型信息(如必填属性、属性初始值、继承、注释),转换为 jsonschema。
为什么开发它?
估计很多小伙伴会问,“社区明明有 typescript-json-schema
、ts-json-schema-generator
这样生态更完善的库,为什么还要重复造轮子?”
答案是:在使用这些库时,发现解析速度很慢,这对于想追求完美体验的开发者来说是难以忍受的。为此,团队开发了一款使用更便捷、解析更高效的工具--fast-typescript-to-jsonschema
。
与社区框架对比
与社区框架 typescript-json-schema
进行对比。
很明显, typescript-json-schema
类型支持更完善,这是不可否认的。
但是,解析速度特别慢!解析速度对比见下。
解析速度对比
ts代码 | fast-typescript-to-jsonschema | typescript-json-schema |
---|---|---|
代码块1 | 20.13 ms | 1850 ms |
代码块2 | 19.20 ms | 1760 ms |
代码块3 | 20.78 ms | 1875 ms |
代码块4 | 19.15 ms | 1856 ms |
代码块5 | 19.55 ms | 1739 ms |
平均耗时 | 19.76 ms | 1816 ms |
结论
fast-typescript-to-jsonschema
解析速度极快,解析时间仅为 typescript-json-schema
的 1.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 应用场景
- 生成 JSON 格式可读文档
- 对数据作校验
- 根据 JSON Schema 生成数据采集 UI
- 使用 JSON Schema 生成 mock 数据
关于我们
团队隶属于明源云客前端架构团队,希望通过研发框架和研发工具改善前端开发者的体验。欢迎关注我们的 GitHub 仓库:
参考链接
转载自:https://juejin.cn/post/7086791350674259998