我有数字或数字字符串,我希望将其转换为数字,并通过.min() .max()继续验证它,但它不像我预期的那样工作。
const numberValid = z.number().or(z.string().regex(/^\d+$/).transform(Number));
const positiveNumber = numberValid.min(0); // method don't exist发布于 2022-03-15 08:05:56
问题是,transform将返回一个z.ZodEffect,该z.ZodEffect具有用于进一步转换的方法,但它已经失去了原来是z.string的事实。无法访问来自z.number的z.number方法,因为外部类型将是z.ZodUnion,后者也不知道min细化。
我认为,为了得到你想要的行为,我可能会采取这样的方法:
const thing = z
.number()
.or(z.string().regex(/\d+/).transform(Number))
.refine((n) => n >= 0);诚然,这有点缺乏光泽,因为我们不能依靠min的简化语法和更好的错误。您可以通过向{ message: 'value was less than 0' }添加一个refine作为第二个参数来解决后一个问题。
编辑
这引起了一些关注,我意识到还有另一种方法。在将值传递给preprocess之前,可以使用z.number来处理字符串。如果你这样做,你仍然可以利用.min的所有好的错误信息和东西。
const numberValid2 = z.preprocess(
(input) => {
const processed = z.string().regex(/^\d+$/).transform(Number).safeParse(input);
return processed.success ? processed.data : input;
},
z.number().min(0),
)https://stackoverflow.com/questions/71052832
复制相似问题