我让 JSON.stringify() 函数的速度提高了 10 倍,并且类型安全
// FASTER STRINGIFY FUNCTIONS
export function stringify<T>(input: T): string; // unsafe but fatest
export function assertStringify<T>(input: T): string; // throws TypeGuardError
export function isStringify<T>(input: T): string | null; // wrong type be null
// RUNTIME VALIDATORS ALLOWING SUPERFLUOUS PROPERTIES
export function is<T>(input: unknown): input is T; // returns boolean
export function assertType<T>(input: unknown): T; // throws TypeGuardError
export function validate<T>(input: unknown): IValidation; // detailed reasons
// DO NOT ALLOW SUPERFLUOUS PROPERTIES
export function equals<T>(input: unknown): input is T;
export function assertType<T>(input: unknown): T;
export function validate<T>(input: unknown): IValidation;
大家好,我是typescript-json的开发者,它只需一行代码就能验证实例类型,之前我在dev.to上介绍过它“运行速度快 1000 倍的验证器库” 。今天,我又带着强大的 JSON 字符串转换函数回来了。
从上面的代码可以看出,当值与目标类型不同时,新的 JSON 字符串转换函数会抛出TypedGuardError
或返回null
值。令人惊奇的是,尽管进行了类型验证,这些 JSON 字符串转换函数仍然比原生函数快得多。input
T
JSON.stringify()
当然,由于这个基准是由我本人测量的,有人可能会怀疑它的客观性。
因此,为了确保客观性,我公开了基准测试中使用的所有代码。基准测试中使用的代码如下。您也可以在克隆typescript-json仓库后,通过运行
npm install
和npm run benchmark
命令来运行基准测试程序。
如何使用
如果您想使用这些类型安全的 JSON 函数,只需安装并导入typescript-json即可。之后,像下面这样调用这些函数即可。您无需定义任何额外的专用函数,例如需要 JSON 模式定义的fast-json-stringify。您只需要一行纯 TypeScript 类型的代码即可。
需要注意的是,当参数值与目标类型不同时,函数TSON.assertStringify()
会抛出TypeGuardError
异常,并TSON.isStringify()
返回值。当然,如果值与类型匹配,则只会返回 JSON 字符串。总之,请根据您的目的选择其中一种。boolean
input
T
input
T
import TSON from "typescript-json";
interface IMember {
name: string;
age: number;
}
// NO PROBLEM
const exact: IMember = { name: "someone", age: 0 };
TSON.assertStringify(exact);
TSON.isStringify(exact);
// WRONG TYPE
const wrong: IMember = { name: "someone", age: false as any };
TSON.assertStringify(wrong); // throws TypeGuardError
TSON.isStringify(wrong); // returns null
怎么会这么快
AOT(提前)编译。
typescript-json会在编译级别分析你的代码(类型T
),并生成用于 JSON 字符串转换的优化运行时代码。这种通过分析源代码来优化运行时代码生成的方式被称为 AOT(Ahead of Time,提前编译)。正因如此,尽管存在类型验证过程, typescript-json的 JSON 字符串转换函数仍然比原生函数快得多JSON.stringify()
。
同理,typescript-json的验证函数比其他验证库快很多。只有TypeBox可以与之匹敌,而且TypeBox采用的是 JIT(Just-in-time)编译。其他没有特殊技巧的库速度极慢,差距可能达到数千倍。
有人可能会问:“为什么要和其他验证器库比较?其他 JSON 字符串转换库在哪里?” 很遗憾,目前还没有其他库能像typescript-json一样安全地转换 JSON 字符串。因此,我不得不与其他验证器库进行比较。请理解我的情况。
TypeScript 类型的完整规范
typescript-json支持 TypeScript 类型的完整规范。
因此,使用TSON.assertStringify()
和TSON.isStringify()
函数可以放心地增强程序的类型安全性。我希望这些函数对于使用 JSON 数据的网络系统能够真正发挥作用,尤其是在增强类型安全性方面。
成分 | TSON |
TypeBox |
ajv |
io-ts |
zod |
C.V. |
---|---|---|---|---|---|---|
便于使用 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
对象(简单) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
对象(分层) | ✔ | ✔ | ❌ | ✔ | ✔ | ✔ |
对象(递归) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
对象(联合,隐式) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
对象(联合,显式) | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ |
对象(附加标签) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
对象(模板文字类型) | ✔ | ✔ | ✔ | ❌ | ❌ | ❌ |
对象(动态属性) | ✔ | ✔ | ✔ | ❌ | ❌ | ❌ |
数组(分层) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
数组(递归) | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ |
数组(递归、联合) | ✔ | ✔ | ❌ | ✔ | ✔ | ❌ |
数组(R+U,隐式) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
终极联合类型 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
文章来源:https://dev.to/samchon/i-made-10x-faster-jsonstringify-functions-even-type-safe-2eme
- 索尼:
typescript-json
- 简历:
class-validator