如何用Zod Schema实现字段可选或满足最小字符串长度约束?
问题描述
需要给字段设置约束:要么这个字段可以不填(可选),要么填了的话如果不是空值,长度至少得有4位。试了下面这段代码:
export const SocialsSchema = z.object({ myField: z.optional(z.string().min(4, "Please enter a valid value")), });
传"good"这类值能过验证,但传空字符串的时候就失败了。想问下怎么用Zod正确实现这种「可选,且非空时满足最小长度」的约束?能不能不用正则表达式?
解决方案
你这问题出在z.optional(z.string().min(4))的逻辑上:它允许字段不存在,但只要字段存在,就必须是长度≥4的字符串——空字符串自然会被min(4)的规则拦下来,所以验证失败。
要实现「字段可选,存在时允许空字符串,非空则长度至少4」的需求,完全不用正则,用Zod的联合类型union就行:
import { z } from "zod"; export const SocialsSchema = z.object({ myField: z.optional(z.union([ z.literal(""), // 允许空字符串 z.string().min(4, "Please enter a valid value") // 非空时长度至少4位 ])) });
要是你的需求是「字段可选,只要填了就必须是非空且长度≥4的字符串(空字符串不允许)」,那你原来的代码逻辑其实是对的,此时空字符串验证失败是符合预期的。但如果想让空字符串也能通过,上面的union写法就刚好满足。
另外,也可以写成z.string().min(4).optional().or(z.literal("")),效果和上面完全一样,核心都是用联合类型覆盖两种合法情况。
内容的提问来源于stack exchange,提问作者Barry Michael Doyle
相关产品推荐
相关产品推荐

