如何使用zod.nativeEnum排除枚举中的指定项?
Zod枚举排除指定项的正确实现方法
你定义的Color枚举如下:
enum Color { Red = 'red', Green = 'green', Blue = 'blue', }
你之前尝试的.not(Color.Red)写法错误,因为z.nativeEnum().not()方法需要传入Zod类型而非直接的枚举值。下面是三种可行的解决方案:
方法一:用z.enum手动构建允许的枚举值列表
先过滤掉不需要的枚举项,再用z.enum创建验证规则:
// 筛选出允许的颜色值 const allowedColors = Object.values(Color).filter(color => color !== Color.Blue); // 创建Schema,类型断言确保Zod识别为字面量元组 const schema = z.object({ color: z.enum(allowedColors as [typeof Color.Red, typeof Color.Green]), });
方法二:用z.nativeEnum结合refine自定义验证
保留原生枚举的基础验证,再通过refine添加排除规则:
const schema = z.object({ color: z.nativeEnum(Color).refine( color => color !== Color.Blue, { message: '颜色不能为Blue' } ), });
方法三:用z.nativeEnum结合not和literal
给not传入z.literal包装的枚举值,精准排除指定项:
const schema = z.object({ color: z.nativeEnum(Color).not(z.literal(Color.Blue)), });
内容的提问来源于stack exchange,提问作者Sufail Kalathil
相关产品推荐
相关产品推荐

