gpt4 book ai didi

typescript - zod:将字符串转换为数字后设置最小最大值

转载 作者:行者123 更新时间:2023-12-05 08:21:41 27 4
gpt4 key购买 nike

我有数字或数字字符串,我想将它转换为数字并继续通过 .min() .max() 验证它,但它不起作用正如我所料

const numberValid = z.number().or(z.string().regex(/^\d+$/).transform(Number));

const positiveNumber = numberValid.min(0); // method don't exist

最佳答案

问题是 transform 将返回一个 z.ZodEffect,它具有进行进一步转换的方法,但忘记了它原来是z.stringz.number 中的 min 方法不可访问,因为外部类型将是 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),
)

关于typescript - zod:将字符串转换为数字后设置最小最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71052832/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com