You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:24:58