基于获取数据的Zod条件验证实现咨询:仅当tsmax>0时应用lte验证
基于获取数据的Zod条件验证实现咨询:仅当tsmax>0时应用lte验证
嘿,这个需求很常见,我来给你两种实用的实现方式,你可以根据自己的代码风格来选:
方法一:动态构建Schema(直观易懂)
这种方式先搭好基础的gte验证规则,再根据tsmax的数值决定是否追加lte限制,代码读起来清晰直白,维护起来也省心:
const tsmin = Number(getMinMechProp("tensilestrength")); const tsmax = Number(getMaxMechProp("tensilestrength")); // 先定义带gte验证的基础规则 let tensilestrengthSchema = z.coerce.number().gte(tsmin, `Value must be at least ${tsmin}`); // 仅当tsmax大于0时,追加lte验证 if (tsmax > 0) { tensilestrengthSchema = tensilestrengthSchema.lte(tsmax, `Value must be at most ${tsmax}`); } // 组合成最终的对象Schema const mechPropSchema = z.object({ tensilestrength: tensilestrengthSchema, });
方法二:使用Zod的refine方法(灵活强大)
如果后续你可能需要更复杂的验证逻辑,或者想保持链式调用的写法,用refine就很合适。在refine的回调里,我们可以自由控制验证的触发条件:
const tsmin = Number(getMinMechProp("tensilestrength")); const tsmax = Number(getMaxMechProp("tensilestrength")); const mechPropSchema = z.object({ tensilestrength: z.coerce.number() .gte(tsmin, `Value must be at least ${tsmin}`) .refine((val) => { // 只有tsmax>0时才执行lte检查,否则直接通过验证 return tsmax > 0 ? val <= tsmax : true; }, { // 动态生成错误提示信息 message: tsmax > 0 ? `Value must be at most ${tsmax}` : "", // 指定错误路径,方便定位问题字段 path: ["tensilestrength"], }), });
两种方法都能完美满足你的需求:第一种更偏向基础场景,代码简洁易读;第二种则适合后续有扩展复杂验证逻辑的情况,灵活性拉满。
备注:内容来源于stack exchange,提问作者iiotian
相关产品推荐
相关产品推荐

