如何使用Zod实现包含固定字面量对象和可选同结构对象的数组校验
Zod 校验实现方案
Zod 完全支持该校验需求,核心实现逻辑为:先约束数组所有元素的通用结构,再通过自定义校验规则确认必填的固定字面量对象存在即可。
简洁版实现
如果没有对必填固定项的特殊字段约束,直接用以下代码即可:
import { z } from "zod"; const TargetSchema = z.array( // 先定义所有元素的通用结构 z.object({ name: z.string(), otherprop: z.number() }) ).refine( // 自定义校验:确认两个必填name都存在 (arr) => { const hasRequired1 = arr.some(item => item.name === "required1"); const hasRequired2 = arr.some(item => item.name === "required2"); return hasRequired1 && hasRequired2; }, { message: "数组必须包含 name 为 required1 和 required2 的两个对象" } );
需约束必填项结构的实现
如果要求必填的required1/required2项除了name之外还有特殊字段约束,可以拆分结构实现:
import { z } from "zod"; // 公共基础结构 const BaseItem = z.object({ otherprop: z.number() }); // 两个必填固定项的独立结构(可单独扩展独有字段规则) const Required1Item = BaseItem.extend({ name: z.literal("required1") }); const Required2Item = BaseItem.extend({ name: z.literal("required2") }); // 可选追加项结构 const OptionalItem = BaseItem.extend({ name: z.string() }); const TargetSchema = z.array(z.union([Required1Item, Required2Item, OptionalItem])) .refine( (arr) => arr.some(i => i.name === "required1") && arr.some(i => i.name === "required2"), { message: "缺少 required1 或 required2 对象" } );
校验效果
- 符合要求的数组可正常通过校验
- 缺少
required2的数组会触发自定义错误提示 - 任意元素结构不符合要求(如
otherprop为字符串)会触发对应结构报错
内容的提问来源于stack exchange,提问作者Lzok
相关产品推荐
相关产品推荐

