如何使用Zod验证自定义数值枚举类型的数组?
Zod验证自定义数值枚举数组的正确方法
TypeScript的枚举类型无法直接作为Zod的schema使用,你之前尝试的两种方式无效的原因是:
z.array(Day)直接传入TS枚举类型,Zod无法识别这种非Zod原生的schema结构z.array(Day.MONDAY | Day.TUESDAY...)使用TS联合类型,该类型在运行时会被擦除,Zod无法基于此做验证
下面是两种可行的验证方案:
方案1:验证整个枚举的有效值数组
使用z.nativeEnum将TS枚举转换为Zod可识别的schema,再用z.array包裹:
import { z } from "zod"; enum Day { MONDAY = 1, TUESDAY = 2, WEDNESDAY = 3, } // 生成枚举对应的Zod schema const DaySchema = z.nativeEnum(Day); // 生成枚举数组的验证schema const DayArraySchema = z.array(DaySchema); // 验证示例 DayArraySchema.parse([1, 2]); // 验证通过 DayArraySchema.parse([1, 4]); // 抛出ZodError,4不属于Day枚举的有效值
方案2:验证枚举中指定值组成的数组
如果只需要允许枚举中的部分值,可结合z.union和z.literal手动定义允许的枚举值:
import { z } from "zod"; enum Day { MONDAY = 1, TUESDAY = 2, WEDNESDAY = 3, } // 仅允许MONDAY和TUESDAY的schema const LimitedDaySchema = z.union([ z.literal(Day.MONDAY), z.literal(Day.TUESDAY), ]); // 生成指定值数组的验证schema const LimitedDayArraySchema = z.array(LimitedDaySchema); // 验证示例 LimitedDayArraySchema.parse([1, 2]); // 验证通过 LimitedDayArraySchema.parse([1, 3]); // 抛出ZodError,3不在允许范围内
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

