Zod是否有与Yup的oneOf()等效的属性值验证方法?
Zod 实现属性值限定为特定选项的简洁方式
在Zod里完全不需要用superRefine这种繁琐写法,有几种更简洁的方案,可根据值的类型选择:
1. 数字类型的可选值
最直接的方式是用z.union结合z.literal,明确限定允许的数字:
const schema = z.object({ prop: z.union([z.literal(5), z.literal(10), z.literal(15)]) });
如果允许的值较多,不想逐个写z.literal,也可以用refine的简写形式,比superRefine精简很多:
const allowedValues = [5, 10, 15]; const schema = z.object({ prop: z.number().refine( val => allowedValues.includes(val), { message: "prop 必须是 5、10、15 中的一个" } ) });
2. 字符串类型的可选值
如果是字符串选项,直接用z.enum即可,和Yup的oneOf用法逻辑一致:
const schema = z.object({ prop: z.enum(["5", "10", "15"]) });
以上几种方式都能实现和Yup中oneOf相同的验证效果,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Boris Boskovic
相关产品推荐
相关产品推荐

