如何在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
相关产品推荐
相关产品推荐

