Lzh on GitHub

考虑到更大的功能集和更小的打包体积,Valibot 的实现没有将 JSON Schema 作为主要考量。然而,在某些用例中,你可能仍然需要 JSON Schema。本指南将向你展示如何将 Valibot 模式转换为 JSON Schema 格式。

Valibot 到 JSON Schema

Valibot 的大部分模式都与 JSON Schema 兼容,并且可以使用官方的 toJsonSchema 函数轻松转换为 JSON Schema 格式。这个函数是通过一个名为 @valibot/to-json-schema 的独立包提供的。

有关更多详细信息,请参阅 @valibot/to-json-schema 包的 README。同时,我们也建议你查看这篇博客文章,其中重点介绍了最近的改进。

import { toJsonSchema } from '@valibot/to-json-schema';
import * as v from 'valibot';

const ValibotEmailSchema = v.pipe(v.string(), v.email());
const JsonEmailSchema = toJsonSchema(ValibotEmailSchema);

// -> { type: 'string', format: 'email' }

JSON Schema 的缺点

Valibot 模式有意不原生输出 JSON Schema。这是因为 JSON Schema 仅限于符合 JSON 的数据结构。此外,它不支持像转换(transformations)这样更高级的功能。由于我们想利用 TypeScript 的全部能力,因此我们输出的是一种自定义格式。

JSON Schema 的另一个缺点是它本身不包含任何验证逻辑。因此,需要一个额外的函数来验证整个 JSON Schema 规范。这种方法通常不可进行摇树优化(tree-shakable),导致打包体积庞大。

相比之下,Valibot 的 API 设计和实现是完全模块化的。每个模式都是独立的,并包含其自身的验证逻辑。这使得模式可以像乐高积木一样组合在一起,由于摇树优化,从而产生更小的打包体积。

JSON Schema 的优点

尽管存在这些缺点,JSON Schema 在业界仍然被广泛使用,因为它也具有许多优点。例如,JSON Schema 可以在不同的编程语言和工具之间使用。此外,JSON Schema 是 可序列化的,可以轻松存储在数据库中或通过网络传输。