首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zod:将字符串转换为数字后设置最小最大值

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

Stack Overflow用户
提问于 2022-02-09 16:01:07
回答 1查看 3.5K关注 0票数 2

我有数字或数字字符串,我希望将其转换为数字,并通过.min() .max()继续验证它,但它不像我预期的那样工作。

代码语言:javascript
复制
const numberValid = z.number().or(z.string().regex(/^\d+$/).transform(Number));

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

回答 1

Stack Overflow用户

发布于 2022-03-15 08:05:56

问题是,transform将返回一个z.ZodEffect,该z.ZodEffect具有用于进一步转换的方法,但它已经失去了原来是z.string的事实。无法访问来自z.numberz.number方法,因为外部类型将是z.ZodUnion,后者也不知道min细化。

我认为,为了得到你想要的行为,我可能会采取这样的方法:

代码语言:javascript
复制
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的所有好的错误信息和东西。

代码语言:javascript
复制
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),
)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71052832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档