Skip to content

Zod vs class-validator — Evaluation

评估日期:2026-07-29 状态:暂不迁移,待触发条件满足后重新评估(见 ADR-0016


对比

维度Zodclass-validator(当前)
类型推断z.infer<typeof schema> 自动推导❌ 需手动写 interface
前端可用✅ 零依赖,轻量❌ 依赖 reflect-metadata + decorators
NestJS 集成需自定义 PipeValidationPipe 原生支持
Swagger 文档需额外配置✅ 装饰器内联 Swagger
前端表单验证✅ VeeValidate + Zod 原生集成❌ 需单独写验证规则
当前代码库0 使用~100+ DTO 类,6 个子系统,30+ 装饰器文件
学习成本中(团队需学习 Zod DSL)低(团队已熟悉)
运行时性能中等中等

不迁移的原因

  1. 装饰器体系已成熟WalnutAdminDecoratorField* 将 validation + transformation + Swagger docs 统一到一个装饰器中,实现了类似 Zod "单一声明"的体验
  2. 迁移成本太高:涉及 16 个 guard、中件间/interceptor 层、libs/decorators/ 6 个子系统、~100+ DTO 类
  3. 前端表单验证复用不是当前痛点:要发挥 Zod 的前后端复用优势,需要前端接入 VeeValidate + Zod,目前没有这个需求
  4. 避免双范式并存:逐步迁移意味着长期维护 class-validator 和 Zod 两套体系

触发条件(何时重新评估)

触发条件说明
前端接入 VeeValidate + ZodDRY 验证变为可实现
新建 NestJS 绿场模块可在新模块试点 Zod,无需迁移旧代码
class-validator 停止维护或不兼容 NestJS 新版本强制迁移
3+ 个前端应用共享同一后端共享 schema 的 ROI 提高

参考

基于 MIT 许可发布