[Typia] 我制作了实时演示网站,验证速度提高了 20,000 倍(JSON 字符串化速度提高了 200 倍)

2025-06-10

[Typia] 我制作了实时演示网站,验证速度提高了 20,000 倍(JSON 字符串化速度提高了 200 倍)

前言

https://typia.io/playground

我创建了一个游乐场网站来帮助您了解typiaAoT 编译的工作原理。

我在dev.to社区写过很多文章介绍我的库typia。在之前的文章中,我经常讲解如何typia通过 AoT (Ahead of Time) 编译技巧来提升验证速度。

  • typia分析你的 TypeScript 类型T
  • typia仅为该类型编写最佳验证代码T
  • 这种技巧被称为AoT编译。


// TYPESCRIPT SOURCE CODE
typia.is<number>(3);
typia.createIs<Date>();

// COMPILED JAVASCRIPT CODE
((input) => "number" === typeof input)(3);
(input) => input instanceof Date;


Enter fullscreen mode Exit fullscreen mode

顺便说一下,一些typia用户给了我这样的反馈:

读了你的文章,我明白你的typia代码比其他代码快得多,而且只需要纯 TypeScript 类型。由于我已经用了很久,所以我特别喜欢“一行纯 TypeScript 代码”这句话ajvclass-validator

然而,AoT 编译的概念对我来说很难理解。直到安装并编译了我的项目后,我才明白它的含义typia。设置完成后,我以为这么短的时间甚至会成为那些犹豫是否要引入它的人的障碍typia。如果typia能提供一个游乐场网站,这个问题或许就能解决了。

希望typia蓬勃发展,并感谢开发如此出色的项目。

读了以上反馈,我决定开发一个符合需求的游乐场网站。在开发游乐场网站的过程中,我认为以上反馈非常有帮助typia,而且之前体验过游乐场的用户也非常满意。我特别感谢你们提供的建议。

无论如何,让我们来玩一下typia并了解它如何与 AoT 编译一起工作。

游乐场截图

什么typia

介绍



// RUNTIME VALIDATORS
export function is<T>(input: unknown | T): input is T; // returns boolean
export function assert<T>(input: unknown | T): T; // throws TypeGuardError
export function validate<T>(input: unknown | T): IValidation<T>; // detailed
export const customValidators: CustomValidatorMap; // customizable

// ENHANCED JSON
export function application<...Args>(): IJsonApplication; // JSON schema
export function assertParse<T>(input: string): T; // type safe parser
export function assertStringify<T>(input: T): string; // safe and faster
    // +) isParse, validateParse 
    // +) stringify, isStringify, validateStringify

// RANDOM DATA GENERATOR
export function random<T>(g?: Partial<IRandomGenerator>): Primitive<T>;


Enter fullscreen mode Exit fullscreen mode

有些人不知道typia,我就简单介绍一下。

typia是一个支持以下功能的变压器库。

  • 超快运行时验证器
  • 安全的 JSON 解析和快速的字符串化函数
  • JSON 模式生成器
  • 随机数据生成器

纯 TypeScript 类型

首先,astypia执行 AoT(提前编译),所有支持的功能typia只需一行即可实现。此外,其他库(例如ajv或)class-validator需要额外的模式定义,例如 JSON 模式或带有装饰器函数调用的三重重复类型定义。



//----
// TYPIA SCHEMA
//----
// TYPIA NEEDS ONLY PURE TYPESCRIPT TYPE
export interface IBbsArticle {
    files: IAttachmentFile[];
}
typia.assert<IBbsArticle>(input);

//----
// CLASS-TARNSFORMER
//----
// BESIDES, OTHERS NEED EXTRA-SCHEMA DEFINITION
export class BbsArticle {
    @ApiProperty({
        type: () => AttachmentFile,
        nullable: true,
        isArray: true,
        minItems: 1,
        description: "List of attached files.",
    })
    @Type(() => AttachmentFile)
    @IsArray()
    @IsObject({ each: true })
    @ValidateNested({ each: true })
    public files: AttachmentFile[];
}
validateSync(plainToObject(BbsArticle, input));


Enter fullscreen mode Exit fullscreen mode

稳定

在功能性和稳定性方面,typia它支持所有 TypeScript 类型,并通过超过 90 万行代码 (LoC) 测试程序确保安全性。它通过强大而广泛的测试用例,实际验证了所有 TypeScript 类型用例。下表列出了这些强大测试的结果。

此外,其他库也像 一样,缺乏安全性的考量typia。例如,class-validator它只包含 16 个测试函数,并且缺少大多数类型的用例。我认为它在大多数用例中失败的原因class-validator是,它没有足够的测试用例。

成分 typia TypeBox ajv io-ts zod C.V.
便于使用
对象(简单)
对象(分层)
对象(递归)
对象(联合,隐式)
对象(联合,显式)
对象(附加标签)
对象(模板文字类型)
对象(动态属性)
数组(剩余元组)
数组(分层)
数组(递归)
数组(递归、联合)
数组(R+U,隐式)
数组(重复)
数组(重复、联合)
终极联合类型

C.V.方法class-validator

表现

关于性能,typia是世界上最快的库。

如您所知,typia我们会为每种类型生成专用的验证代码。这些代码会根据 V8 引擎的特性(尤其是隐藏类)进行优化。下图展示了优化后的结果。

断言

验证速度比class-validator

字符串化

JSON 序列化比class-transformer

服务器性能

这样的性能甚至影响到服务器端 -> 提高 30 倍

摩纳哥编辑

https://microsoft.github.io/monaco-editor/

我想肯定有人对如何搭建游乐场网站感兴趣。对于这样的人,我会简单介绍一下我是如何搭建的。

首先,我通过编辑器创建了typia一个 Playground 网站monaco。它是一个基于 Web 的单文件编辑器,支持通过外部 运行 TypeScript 代码。正如你在Playground 网站node_modules中看到的,它甚至支持使用 之类的类型提示进行自动补全typiaVsCode

如您所知,typia它会执行 AoT(提前)编译,并为每种 TypeScript 类型生成专用的验证代码。因此,我将上面的 monaco 编辑器与捆绑的模块组合在一起typiatypescript此外,为了使用类型提示自动完成功能,我将d.ts(定义)文件硬复制typia到编辑器中,monaco如下所示。

阅读monaco手册并参考我的关键源文件,你或许能够构建自己的游乐场网站。祝你好运!



export const RAW: [file: string, content: string][] = [
  ["file:///node_modules/typia/package.json", typia_packageJson],
  ["file:///node_modules/typia/index.d.ts", typia_index],
  ["file:///node_modules/typia/lib/CustomValidatorMap.d.ts", typia_lib_CustomValidatorMap],
  ["file:///node_modules/typia/lib/executable/setup/ArgumentParser.d.ts", typia_lib_executable_setup_ArgumentParser],
  ["file:///node_modules/typia/lib/executable/setup/CommandExecutor.d.ts", typia_lib_executable_setup_CommandExecutor],
  ["file:///node_modules/typia/lib/executable/setup/FileRetriever.d.ts", typia_lib_executable_setup_FileRetriever],
  ["file:///node_modules/typia/lib/executable/setup/PackageManager.d.ts", typia_lib_executable_setup_PackageManager],
  ["file:///node_modules/typia/lib/executable/setup/PluginConfigurator.d.ts", typia_lib_executable_setup_PluginConfigurator],
  ["file:///node_modules/typia/lib/executable/typia.d.ts", typia_lib_executable_typia],
  ["file:///node_modules/typia/lib/executable/TypiaGenerateWizard.d.ts", typia_lib_executable_TypiaGenerateWizard],
  ["file:///node_modules/typia/lib/executable/TypiaSetupWizard.d.ts", typia_lib_executable_TypiaSetupWizard],
  ["file:///node_modules/typia/lib/factories/CommentFactory.d.ts", typia_lib_factories_CommentFactory],
  ["file:///node_modules/typia/lib/factories/ExpressionFactory.d.ts", typia_lib_factories_ExpressionFactory],
  ["file:///node_modules/typia/lib/factories/IdentifierFactory.d.ts", typia_lib_factories_IdentifierFactory],
  ...
];
for (const [file, content] of RAW)
    monaco.languages.typescript.typescriptDefaults.addExtraLib(
        content, 
        file
    );


Enter fullscreen mode Exit fullscreen mode
鏂囩珷鏉ユ簮锛�https://dev.to/samchon/typia-i-made-realtime-demo-site-of-20000x-faster-validation-200x-faster-json-stringify-59p9
PREV
作为 C# 开发人员你需要知道的事情 - 集合、数组、集合、列表、LinkedList、字典和相关类型、堆栈、队列、HashSet、只读集合、关于集合时间复杂度的一些注释、参考
NEXT
关于 AI 函数调用和 MCP 的一切,Agentic AI 的关键词