Schema 验证库(Zod/Valibot)

共 33 题
📑 题目列表 33 题
#
★★★

1. Yup/joi/zod 在前后端共享 schema 的工程取舍

Yup/joi/zod 在前后端共享 schema 的工程取舍是什么?

  • 各库特性
  • 跨端共享
  • 类型推导

Yup 老牌、浏览器友好但类型推导弱;joi 功能强但体积大、偏后端;zod 类型推导强、Tree-shake 友好、生态广,是前后端共享 schema 的主流。共享 schema 的价值:前后端用同一 schema 校验,避免重复定义与不一致。取舍:zod 类型安全与生态最优,Yup 兼容旧项目,joi 后端场景。前端优先 zod。

共享 schema 用 zod 类型推导强、可跨端;Yup/joi 各有场景,按需求选择。

#
★★★

2. RHF + Zod 与 Conform + Valibot 的选型

RHF + Zod 与 Conform + Valibot 的选型权衡是什么?

  • RHF + Zod 组合
  • Conform + Valibot
  • 框架场景

RHF + Zod 是 React SPA 主流:RHF 非受控性能、Zod 类型与校验,resolver 集成。Conform + Valibot 面向 Remix:渐进增强、Valibot 小体积模块化。选型:React SPA 用 RHF + Zod;Remix/渐进增强用 Conform + Valibot;体积敏感用 Valibot。按框架与渐进增强需求选择。

RHF+Zod 适合 SPA,Conform+Valibot 适合 Remix 渐进增强,按场景选型。

#
★★★

3. 多步/向导表单的状态分片(每步独立 schema)与跨步校验、步骤回退时的数据保留设计

多步/向导表单的状态分片、跨步校验与步骤回退时的数据保留如何设计?

  • 每步独立 schema
  • 跨步校验
  • 回退数据保留

多步表单用状态分片:每步独立 schema 校验当前步,整体 schema 在最后汇总。跨步校验:跳步时校验前置步骤,或最终统一校验。回退数据保留:状态存于统一 store(每步字段保留),回退到某步时恢复该步已填数据,不清空。设计:步骤索引 + 分步字段 + 汇总提交,结合"逐步校验 + 回退保留"。

分片存储各步字段、递增校验、回退保留数据,是多步表单的健壮设计。

#
★★★

4. Valibot/ArkType/Effect 在 Zod 体积与性能的工程取舍

Valibot/ArkType/Effect 在 Zod 体积与性能上的工程取舍是什么?

  • Valibot 小体积
  • ArkType 类型优先
  • Effect 类型安全

Valibot 模块化、体积小(tree-shakable),性能好;ArkType 类型优先、编译时推导、运行时校验;Effect 是类型安全的函数式库,schema 是其一部分。取舍:体积敏感用 Valibot,重类型推导用 ArkType,需函数式/Effect 生态用 Effect。Zod 生态最广但体积较大。按体积、类型强度、生态需求选择。

四者各有侧重:Valibot 小、ArkType 类型强、Effect 函数式、Zod 生态广。

#
★★★

5. Zod v4 在 schema 校验与 TypeScript 类型推导的工程价值

Zod v4 在 schema 校验与 TypeScript 类型推导中的工程价值是什么?

  • schema 驱动类型
  • 校验
  • 单一来源

Zod v4 定义 schema 后自动推导 TypeScript 类型(z.infer),校验与类型同源,单一来源避免类型与校验不一致。v4 改进:更小体积、更快、错误信息改进、JSON Schema 转换。工程价值:API 参数、表单、运行时数据校验类型安全,前后端共享 schema,减少重复与不一致。

Zod 的核心价值是"schema 同时驱动类型与校验",单一来源提升类型安全。

#
★★★

6. Valibot 的模块化 API 与 Zod 的 tree-shaking 工程价值

Valibot 的模块化 API 与 Zod 的 tree-shaking 工程价值是什么?

  • Valibot 模块化
  • tree-shaking
  • 体积

Valibot 采用模块化 API,每个校验器(v.string、v.email)独立导出,天然 tree-shakable,只打包用到的部分,体积小。Zod 虽有 tree-shake 但整体结构较重,体积较大。工程价值:bundle 体积敏感场景 Valibot 更优,模块化使其按需引入。二者都让 schema 可摇树,但 Valibot 粒度更细。

Valibot 模块化使 tree-shaking 更彻底,体积更小,是体积敏感场景的优势。

#
★★★

7. Valibot(极小、模块化 API、Tree-shakable)

Valibot(极小、模块化 API、Tree-shakable)的特点是什么?

  • 极小体积
  • 模块化 API
  • tree-shakable

Valibot 以极小体积著称(核心约 1KB 级别),模块化 API 每个校验器独立导出,天然 tree-shakable,只打包用到的部分。它提供与 Zod 相似的 API(v.object、v.string)但更轻。工程价值:bundle 体积敏感、性能优先的项目,用 Valibot 显著减小体积,同时保持 schema 校验与类型推导能力。

Valibot 的极致轻量与模块化,是体积敏感项目的理想选择。

#
★★★

8. Zod(生态最广,事实标准)的 Schema 校验

Zod(生态最广,事实标准)的 Schema 校验特点是什么?

  • 生态
  • 类型推导
  • 集成

Zod 是 schema 校验的事实标准,生态最广:与 RHF、TanStack、tRPC、OpenAPI 等广泛集成。类型推导强(z.infer),schema 与类型单一来源。v4 改进体积与性能。工程价值:生态集成成熟、类型安全、共享 schema 支持好,是大多数项目的默认选择。

Zod 的生态与类型推导是事实标准,广泛集成使其成为默认选择。

#
★★★

9. ArkType(TypeScript-first、编译时优化)

ArkType(TypeScript-first、编译时优化)的特点是什么?

  • 类型优先
  • 编译时优化
  • 运行时

ArkType 是 TypeScript-first 的校验库,用类型系统表达 schema,编译时推导类型,运行时校验。它通过类型 narrow 与优化减少运行时开销,类型推导深度强。工程价值:类型与校验合一、编译时友好、性能好,适合重类型推导与类型优先的项目。但生态较新。

ArkType 发挥 TS 类型系统,编译时优化 + 运行时校验,类型能力突出。

#
★★★

10. Yup(老牌)的企业遗留项目

Yup(老牌)在企业遗留项目中的角色是什么?

  • 老牌成熟
  • 类型推导弱
  • 遗留场景

Yup 是老牌 schema 校验库,API 熟悉、浏览器支持好,但类型推导较弱(与 TS 集成需额外类型)。企业遗留项目:Yup 代码多、RHF 集成成熟,继续使用成本低。取舍:新项目倾向 Zod/Valibot,遗留项目保留 Yup 以降低迁移成本,逐步抽象 schema 层便于替换。

Yup 在遗留项目成熟,新项目用现代库,可抽象校验层平滑迁移。

#
★★★

11. ArkType / Valibot 在 bundle 体积敏感的工程价值

ArkType / Valibot 在 bundle 体积敏感场景中的工程价值是什么?

  • 体积
  • 性能
  • 场景

Valibot 体积极小(模块化 tree-shakable),ArkType 类型优先且运行时优化,二者都适合 bundle 体积敏感场景。相比 Zod 体积较大,Valibot/ArkType 显著减小打包体积并保持校验能力。工程价值:移动端、低配设备、首屏体积敏感的项目,用 Valibot/ArkType 在体积与性能上占优。

体积敏感场景 Valibot/ArkType 以更小体积与优化性能占优,区别于 Zod。

#
★★★

12. SuperJSON/Standard Schema 在跨 web/electron/node 共享 schema 的工程价值

SuperJSON/Standard Schema 在跨 web/electron/node 共享 schema 中的工程价值是什么?

  • Standard Schema 规范
  • SuperJSON 序列化
  • 跨端共享

Standard Schema 是统一的 schema 校验规范接口,让不同校验库(Zod/Valibot/ArkType)可互操作;SuperJSON 处理非 JSON 值(Date、Map、BigInt)的序列化。工程价值:Standard Schema 让校验库可替换、跨端共享;SuperJSON 让复杂数据在 web/electron/node 间传输。二者提升跨端 schema 与数据共享。

Standard Schema 统一校验接口、SuperJSON 序列化复杂值,支撑跨端共享。

#
★★

13. Zod 4 在 TypeScript-first Schema 校验的现代工程价值

Zod 4 在 TypeScript-first Schema 校验中的现代工程价值是什么?

  • 类型优先
  • 校验
  • 现代特性

Zod 4 以 TypeScript-first 设计,schema 定义即类型推导(z.infer),类型与校验单一来源。v4 改进:更小体积、更快执行、错误信息、JSON Schema 转换、更简洁 API。现代工程价值:类型安全贯穿表单/API/校验,与 tRPC、RHF 集成,前端后端共享 schema,减少不一致。

Zod 4 的 TS-first 与改进,强化类型安全与跨端共享,是现代 schema 校验首选。

#
★★

14. Yup 在 React Hook Form 的经典集成与现状

Yup 在 React Hook Form 的经典集成与现状是什么?

  • yupResolver
  • 集成
  • 现状

Yup 与 RHF 通过 yupResolver 集成,schema 驱动校验与错误。经典集成成熟、文档多。现状:Yup 类型推导弱,新项目用 zodResolver(类型强)或 Valibot;Yup 遗留项目仍可用但增量少。取舍:遗留 Yup 继续,新项目选类型更强的 resolver。

Yup + RHF 经典但类型弱,新项目转向 zodResolver 等类型强方案。

#
★★

15. ArkType 在 TypeScript 推导性能的现代应用

ArkType 在 TypeScript 推导性能上的现代应用是什么?

  • 编译时推导
  • 性能
  • 应用

ArkType 用 TypeScript 类型系统在编译时推导 schema 类型,减少运行时的类型处理,运行时校验也优化。现代应用:类型推导性能好、编译时友好,适合大型代码库与类型强校验场景。配合 type 优化,减少运行时开销。但生态较新,需评估。

ArkType 的编译时类型推导提升性能,是类型驱动场景的现代选择。

#
★★

16. Zod 4 的 z.infer 在类型推导的工程价值

Zod 4 的 z.infer 在类型推导中的工程价值是什么?

  • z.infer 推导类型
  • 单一来源
  • 应用

z.infer 从 schema 推导出 TypeScript 类型,如 type User = z.infer<typeof userSchema>。工程价值:schema 与类型单一来源,校验与类型一致,避免手写类型与校验不一致;字段、表单、API 类型自动同步。它是 Zod 类型安全的核心。

z.infer 让 schema 直接生成类型,单一来源保证类型与校验一致。

const userSchema = z.object({ id: z.number(), name: z.string() });
type User = z.infer<typeof userSchema>; // { id: number; name: string }
#
★★

17. Zod 4 的 z.coerce 在类型强制转换(字符串转数字)的工程实践

Zod 4 的 z.coerce 在类型强制转换(字符串转数字)中的工程实践是什么?

  • z.coerce 强制转换
  • 字符串转数字
  • 应用

z.coerce.number() 将输入强制转换为数字(如字符串 "42" → 42),z.coerce.string() 等。工程实践:表单输入、URL 参数、JSON 中字符串数字的转换,避免手动 Number()。它把"转换 + 校验"结合,转换失败会报错。适合需要宽松输入的场景。

z.coerce 把类型转换内化到 schema,简化字符串数字等输入处理。

const schema = z.coerce.number(); // "42" -> 42
#
★★

18. ArkType 的 type({...}) 在编译时 Schema 校验的现代应用

ArkType 的 type({...}) 在编译时 Schema 校验中的现代应用是什么?

  • type 定义 schema
  • 编译时校验
  • 应用

ArkType 用 type({...}) 定义 schema,如 type('number') 或对象类型,编译时推导类型、运行时校验。它把 schema 与 TS 类型绑定,编译时类型检查 + 运行时校验。现代应用:输入校验、类型驱动的 API 定义,类型安全贯穿。适合类型优先场景。

ArkType 的 type API 让 schema 编译时可推导、运行时校验,类型与校验合一。

#
★★

19. Yup 的 lazy 在递归 Schema(树形结构)的工程应用

Yup 的 lazy 在递归 Schema(树形结构)中的工程应用是什么?

  • lazy 动态 schema
  • 递归
  • 树形

Yup 的 lazy 根据值动态生成 schema,用于递归结构(树形、嵌套)校验。工程应用:树形菜单、组织结构、嵌套注释的校验,每层根据子节点递归定义 schema。lazy 让动态深度的数据结构可校验。类似 Zod 的 recursive。

lazy 支持递归 schema,是树形/嵌套结构校验的关键。

#
★★

20. Zod 4 的异步校验(refine with async)的现代工程实践

Zod 4 的异步校验(refine with async)的现代工程实践是什么?

  • async refine
  • 服务端校验
  • 应用

Zod 的 refine 支持异步函数,用于需要服务端/异步判断的校验(如用户名唯一性)。工程实践:字段输入后 async refine 调接口校验,配合防抖。RHF 的 resolver 支持 async。它让校验与异步数据源结合,但需注意性能与竞态。

async refine 支持异步校验,适合服务端依赖的校验,配合防抖与竞态处理。

z.string().refine(async (v) => !(await isTaken(v)), '已被占用');
#
★★

21. ArkType 的 morph 在数据转换与校验的现代应用

ArkType 的 morph 在数据转换与校验中的现代应用是什么?

  • morph 转换
  • 校验后转换
  • 应用

ArkType 的 morph 在校验后对数据做转换(如字符串转数字、规范化),类似 Zod 的 transform。工程应用:输入规范化、API 响应映射、类型转换。校验与转换结合,返回转换后的类型。配合类型推导,转换后类型安全。

morph 在校验后转换数据,与校验结合,是数据管线的现代方式。

#
★★

22. Zod 4 的 z.transform 在数据变形(API 响应映射)的工程价值

Zod 4 的 z.transform 在数据变形(API 响应映射)中的工程价值是什么?

  • transform 变形
  • API 映射
  • 类型

z.transform 在 schema 校验后对数据做变形(如把 API 响应映射为前端模型、日期字符串转 Date)。工程价值:把"校验 + 变形"结合,输出类型也可推导,数据管线集中。API 响应映射时用 transform 统一转换,避免散落转换逻辑。

transform 把"校验"与"变形"合并进 schema 管线,使"原始数据到业务模型"的映射集中、可推导且类型安全,避免在各处散落转换逻辑,是数据管线的现代做法。

const userSchema = z.object({ id: z.number(), createdAt: z.string() }).transform((d) => ({ ...d, createdAt: new Date(d.createdAt) }));
#
★★

23. Yup 与 Zod 在 React Hook Form 的现代集成的取舍

Yup 与 Zod 在 React Hook Form 的现代集成中的取舍是什么?

  • yupResolver vs zodResolver
  • 类型
  • 集成

RHF 用 resolver 集成校验库:yupResolver(Yup)与 zodResolver(Zod)。取舍:Zod 类型推导强、生态广、schema 与类型单一来源,现代项目首选;Yup 老牌、API 熟悉但类型弱。集成体验相似,但类型安全与生态上 Zod 优。取舍关注类型、生态、团队熟悉度。

RHF 集成上 Zod 类型与生态更优,Yup 适合熟悉旧方案,按类型需求选择。

#
★★

24. Valibot 的 modular API(object、string 拆分)在 tree-shaking 的工程价值

Valibot 的 modular API(object、string 拆分)在 tree-shaking 中的工程价值是什么?

  • 模块拆分
  • tree-shaking
  • 体积

Valibot 把每个校验器拆成独立模块(v.object、v.string、v.email 各自导出),bundler 只打包用到的模块,tree-shaking 彻底,体积显著减小。工程价值:体积敏感项目中用到的 schema 部分才进 bundle,配合按需引入保持轻量。它比整体导入的库更利于体积控制。

modular API 让 tree-shaking 精准,只打包用到的校验器,是体积控制的优势。

#
★★

25. Zod 4 的 JSON Schema 转换(z.toJSONSchema)在 OpenAPI 的工程应用

Zod 4 的 JSON Schema 转换(z.toJSONSchema)在 OpenAPI 中的工程应用是什么?

  • toJSONSchema
  • OpenAPI 生成
  • 契约

Zod 4 的 z.toJSONSchema 将 Zod schema 转换为 JSON Schema,可用于生成 OpenAPI 文档、API 契约的校验。工程应用:前端 schema 与后端 OpenAPI 契约统一,生成接口文档与校验,减少契约不一致。它是 schema 与 API 规范的桥梁。

toJSONSchema 让 Zod schema 转 JSON Schema,与 OpenAPI 契约联动,支撑契约驱动开发。

#
★★

26. ArkType 与 TypeScript 类型系统的深度集成(type Narrow)的现代边界

ArkType 与 TypeScript 类型系统的深度集成(type Narrow)的现代边界是什么?

  • 类型集成
  • narrow
  • 边界

ArkType 深度集成 TS 类型系统,schema 定义即类型,校验后类型 narrow(收窄)。现代边界:编译时类型推导强、运行时校验与类型一致;但类型系统表达复杂 schema 有限制,动态/运行时复杂逻辑需用 refine/morph 等,且生态较新。边界是类型优先但未必覆盖所有运行时场景。

ArkType 类型集成深,但复杂动态 schema 仍需运行时扩展,生态较新是边界。

#
★★

27. 动态表单(字段动态增删、Schema 动态生成)

动态表单(字段动态增删、Schema 动态生成)如何实现?

  • 动态字段
  • schema 动态生成
  • 校验

动态表单用字段数组(useFieldArray)+ 动态 schema 生成:字段增删时 schema 相应调整(如 z.object 按需构建、z.array 嵌套)。校验需对动态字段正确处理,配合 RHF 的字段名与 zod 动态 schema。工程价值:配置驱动的动态表单(问卷、动态配置),字段变化反映到校验与类型。

动态字段 + 动态 schema 生成,让表单随配置变化,校验也动态适配。

#
★★

28. 嵌套字段数组(useFieldArray 嵌套)的性能问题与校验组织(按路径的 schema)

嵌套字段数组(useFieldArray 嵌套)的性能问题与校验组织(按路径的 schema)是什么?

  • 嵌套动态字段
  • 性能
  • 按路径 schema

嵌套 useFieldArray(数组内嵌数组,如订单行内嵌明细)性能问题:深层嵌套引起重渲染与复杂字段名。校验组织用按路径的 schema:构建与嵌套路径对应的扁平/嵌套 schema,或按路径(items[0].lines[1].qty)校验。优化:字段级订阅、避免整表重渲染、合理拆分组件。校验按路径组织保证错误准确定位。

嵌套动态字段需按路径组织 schema 与错误,关注深层重渲染性能。

#
★★

29. 跨字段联动校验(依赖字段、条件必填、动态 schema)的实现与校验时机

跨字段联动校验(依赖字段、条件必填、动态 schema)的实现与校验时机是什么?

  • 跨字段校验
  • 条件必填
  • 校验时机

跨字段联动校验用 superRefine 或 schema 整体校验(依赖其他字段),条件必填(如"勾选其他则必填")用 conditional schema。动态 schema 根据字段值生成。校验时机:onChange/isDirty/blur 分时机,避免实时校验成本;跨字段用整体校验、字段级用局部校验。实现时注意依赖顺序与重算。

跨字段用整体 schema(superRefine)、条件必填用 conditional,校验时机按需选择。

#
★★

30. 表单 schema 版本化与旧草稿的兼容升级

表单 schema 版本化与旧草稿的兼容升级是什么?

  • schema 版本
  • 旧草稿兼容
  • 迁移

表单 schema 版本化:schema 带版本号,字段变化时迁移旧草稿。迁移:解析旧草稿,按版本映射到新字段(补默认值、字段改名、删除废弃字段)。工程价值:草稿/持久化数据在 schema 升级后仍可用,避免崩溃。实现版本迁移函数 + 校验降级,保证旧数据兼容。

schema 版本化 + 迁移函数,让旧草稿在 schema 升级后兼容,避免数据损坏。

#

31. Zod 与 TypeScript 类型推导,infer 与类型安全的边界?

Zod 与 TypeScript 类型推导:infer 与类型安全的边界是什么?

  • infer 推导
  • 类型安全边界
  • 运行时

z.infer 从 schema 推导类型,编译期类型安全。边界:类型是静态的,运行时仍需校验(类型不保证运行时数据正确);z.infer 只推导"校验通过"的类型,未校验的输入可能不匹配。类型安全边界是"编译期类型声明 + 运行时校验"结合,未校验的外部数据不能假设类型安全。

infer 提供编译期类型,但运行时校验仍是边界,类型 ≠ 运行时保证。

#

32. Valibot 的模块化与体积,按需引入与 tree-shaking?

Valibot 的模块化与体积:按需引入与 tree-shaking 如何工作?

  • 按需引入
  • tree-shaking
  • 体积

Valibot 每个校验器独立模块,按需引入(import { string } from 'valibot'),bundler tree-shaking 只打包用到的模块,体积最小化。工程价值:体积敏感项目按需引入,bundle 只含用到的校验逻辑,避免整体依赖。它与 ES module 的 tree-shaking 配合,实现体积最优。

Valibot 的模块化 + 按需引入 + tree-shaking 实现体积最优,是核心优势。

#

33. Schema 验证在运行时/表单/API 层的应用?

Schema 验证在运行时/表单/API 层的应用是什么?

  • 运行时校验
  • 表单
  • API 契约

Schema 验证在多层应用:运行时校验外部数据(localStorage、URL、用户输入);表单层用 resolver 校验字段;API 层校验请求/响应(tRPC、OpenAPI、RPC)。统一 schema 单一来源,跨层复用。工程价值:数据可信、契约一致、类型安全,贯穿前端到后端。

Schema 在运行时、表单、API 多层应用,单一来源保证类型与校验一致。