Zod预处理字符串转数字报错:Property 'gt'不存在于ZodEffects类型
解决Zod中preprocess后无法调用gt方法的问题
错误原因
z.preprocess()返回的是ZodEffects类型对象,而非ZodNumber,因此无法直接链式调用gt这类数字专属的约束方法。
修复方案
方案一:将约束直接写入目标Schema
把数字的约束直接定义在preprocess的第二个参数(目标验证Schema)中,这是最简洁的写法:
const serviceCostSchema = z.preprocess( // 预处理逻辑:去除字符串开头的前导0后转数字 (val) => Number(String(val).replace(/^0(\d+)/, "$1")), // 直接在number Schema中添加约束 z.number().gte(0, { message: "Service cost must be greater or equal to zero." }) );
注意:原提示文案要求"大于等于0",但你最初用了gt(仅大于),这里改成gte才符合需求逻辑。
方案二:使用pipe链式传递验证
如果需要拆分预处理和约束逻辑,可以用pipe方法将ZodEffects的输出传递给带约束的数字Schema:
const serviceCostSchema = z .preprocess( (val) => Number(String(val).replace(/^0(\d+)/, "$1")), z.number() ) .pipe(z.number().gte(0, { message: "Service cost must be greater or equal to zero." }));
额外说明
- 预处理逻辑中,如果输入是纯"0",
replace会得到空字符串,Number("")结果为0,使用gte(0)可以正常通过验证; - 若输入非数字格式的字符串(比如"abc"),
Number()会返回NaN,此时z.number()会自动抛出验证错误。
内容的提问来源于stack exchange,提问作者UMR
相关产品推荐
相关产品推荐

