如何在Zod子Schema中验证主Schema字段且不嵌套对象?
Zod 分离字段验证逻辑的实现方案
问题背景
我正在使用Zod库,需要验证一个大型Schema中的param1和param2字段,要求二者不能同时为undefined。当前主Schema如下:
const mainSchema = z.object({ id: z.string(), email: z.string(), phone: z.number(), firstName: z.string(), lastName: z.string(), param1: z.optional(z.string()), param2: z.optional(z.string()), })
由于主Schema会持续扩大,直接在主Schema后追加refine会导致代码杂乱,希望能把这两个字段的验证逻辑分离成独立的子Schema,且不需要将param1和param2包装成新的嵌套对象。
可行方案
你可以通过Zod的merge方法实现需求,直接展开子Schema会丢失其绑定的refine规则,merge则能完整保留字段定义和验证逻辑:
1. 定义带验证逻辑的子Schema
单独封装包含目标字段和验证规则的子Schema:
const paramSchema = z .object({ param1: z.optional(z.string()), param2: z.optional(z.string()) }) .refine( ({ param1, param2 }) => !(param1 === undefined && param2 === undefined), { message: 'param1或param2必须至少定义一个' } )
2. 合并主Schema与子Schema
将基础字段的Schema和带验证逻辑的子Schema合并:
// 先定义不含param1/param2的基础主Schema const baseMainSchema = z.object({ id: z.string(), email: z.string(), phone: z.number(), firstName: z.string(), lastName: z.string(), }) // 合并后得到完整的主Schema const mainSchema = baseMainSchema.merge(paramSchema)
3. 效果说明
合并后的mainSchema会保留所有基础字段,同时继承paramSchema中param1、param2的字段规则和二者不能同时为空的验证逻辑,且不会产生嵌套对象。后续新增其他独立验证逻辑时,只需定义新的子Schema并依次merge即可,主Schema结构始终保持清晰。
内容的提问来源于stack exchange,提问作者thenolin
相关产品推荐
相关产品推荐

