基于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
相关产品推荐
相关产品推荐

