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

使用TypeScript枚举键创建Zod枚举时遭遇类型不兼容编译错误

解决Zod枚举与TypeScript枚举结合的类型错误

错误原因

Object.keys(StatusEnum)返回的类型是string[],而Zod的z.enum()要求传入非空的只读字符串元组(readonly [string, ...string[]])。TypeScript无法静态推断Object.keys的结果一定是非空数组,因此抛出类型不匹配的错误。

解决方案

方案1:使用z.nativeEnum直接适配TypeScript枚举

这是最简洁的方式,Zod提供了nativeEnum方法直接支持TypeScript枚举,无需手动处理键值:

const formSchema = z.object({
    status: z
        .union([z.nativeEnum(StatusEnum), z.number()])
        .nullish(),
});

方案2:类型断言确保数组是非空元组

如果坚持用z.enum,可以将Object.keys的结果断言为非空元组,但要保证StatusEnum至少有一个枚举值:

const formSchema = z.object({
    status: z
        .union([z.enum(Array.from(Object.keys(StatusEnum)) as [string, ...string[]]), z.number()])
        .nullish(),
});

方案3:手动定义枚举值元组

手动列出枚举的键,让TypeScript自动推断为元组类型:

// 假设StatusEnum是:enum StatusEnum { Active = 'active', Inactive = 'inactive' }
const statusKeys = ['active', 'inactive'] as const;

const formSchema = z.object({
    status: z
        .union([z.enum(statusKeys), z.number()])
        .nullish(),
});

内容的提问来源于stack exchange,提问作者Kaki Master Of Time

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:27:35