You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:36:06