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

如何在Zod中使用自定义类型创建联合类型?

创建Zod复杂联合类型

首先修正你代码的顺序问题(LoginSchema依赖UserSchema,必须先定义UserSchema):

const UserSchema = z.object({
  _id: z.string().uuid(),
  online: z.boolean()
})

const LoginSchema = z.object({
  token: z.string(),
  user: UserSchema
})

你想要的是Zod schema的联合类型,以及对应的TypeScript类型,z.enum是用来定义字符串/数值枚举的,完全不适合这个场景,正确的做法是用z.union:

1. 创建Zod联合schema

// 组合UserSchema、LoginSchema、LoginSchema数组这三种schema
const CombinedSchema = z.union([
  UserSchema,
  LoginSchema,
  z.array(LoginSchema) // 用z.array()包装LoginSchema来表示数组类型的schema
])

2. 获取对应的TypeScript类型

如果你需要在TypeScript中使用这个联合类型,用z.infer从Zod schema提取:

type CombinedType = z.infer<typeof CombinedSchema>
// 这个类型等价于:User | Login | Login[]
// 其中User是z.infer<typeof UserSchema>,Login是z.infer<typeof LoginSchema>

关键说明

  • 不能直接写LoginSchema[]作为z.union的参数,因为那是TypeScript类型语法,Zod需要用z.array(LoginSchema)来表示数组类型的schema
  • z.union专门用来组合多个Zod schema形成联合类型,是处理这类需求的正确工具

内容的提问来源于stack exchange,提问作者user22399441

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:53:26