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

基于Zod的职业选择及经验输入表单验证方案咨询

正确的Zod Schema实现:复选框关联经验值验证

假设你的表单数据结构是每个职业项包含勾选状态和对应经验值(如下示例结构),下面是针对需求的正确Zod Schema编写方案:

import { z } from "zod";

// 允许的职业列表
const fieldsOfEng = ["前端开发", "后端开发", "UI设计", "产品经理"] as const;

// 单个职业项的验证规则
const ProfessionItemSchema = z.object({
  name: z.enum(fieldsOfEng), // 强制职业必须在指定列表内
  checked: z.boolean(),
  experience: z.number().default(1) // 经验值默认值设为1
}).when("checked", {
  // 当复选框被勾选时,触发经验值验证
  is: true,
  then: z.object({
    experience: z.number().min(2, "勾选的职业从业年限必须大于1")
  }),
  // 未勾选时,经验值无需验证(可保持默认值或任意合法数字)
  otherwise: z.object({
    experience: z.number().optional()
  })
});

// 整体表单的验证Schema
const FormSchema = z.object({
  professions: z.array(ProfessionItemSchema)
});

另一种简化场景:仅存储选中的职业与经验值

如果你的表单数据是仅包含已勾选职业的键值对(键为职业名称,值为对应经验值),可以用更简洁的写法:

const FormSchema = z.record(
  z.enum(fieldsOfEng),
  z.number().min(2, "从业年限必须大于1")
);

这种结构下,只有被勾选的职业会出现在对象中,自动触发经验值的验证规则。

错误示例的问题解析

常见的错误写法是不区分复选框状态,强制验证所有经验值:

// 错误示例:无论是否勾选,都要求经验值大于1
const WrongSchema = z.object({
  name: z.enum(fieldsOfEng),
  checked: z.boolean(),
  experience: z.number().min(2)
});

这种写法会导致未勾选的职业也触发经验值验证,不符合需求。正确的逻辑是通过when或refine实现条件验证,仅在复选框勾选时应用经验值规则。

内容的提问来源于stack exchange,提问作者tdev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:51:30