Zod discriminatedUnion vs union
Definition
z.union([A, B, …])Generic union of unrelated schemas. (DEV Community).- z.discriminatedUnion("key", [A, B, …])
Union of object schemas that all contain the literal-valued propertykey`. (GitHub)
Input constraints
unionaccepts any Zod types (objects, primitives, arrays, effects).discriminatedUnionaccepts onlyZodObjects whosekeyfield is az.literal(...)unique to each branch.
Runtime algorithm
unioniterates through every branch until one succeeds; worst-case O(n) full validation of every branch.discriminatedUnionreads the discriminator value once, selects the matching branch, validates only that branch; constant-time dispatch, faster on large unions. (DEV Community)
Error reporting
unionreturns aggregated branch errors; messages can be verbose and ambiguous.discriminatedUnionreports "invalid discriminator" or branch-specific errors, giving clearer feedback.
Static inference
unionnarrows toA | B | ….discriminatedUnionalso gives safe narrowing when you switch on the discriminator key, mirroring TypeScript's discriminated-union narrowing.
Edge cases
- Overlapping discriminant literals or missing discriminator property cause schema-creation errors in
discriminatedUnion;unionhas no such guard. - Nested
discriminatedUnionrequires.optionsto merge when building larger unions;unionnests without helpers.
When to choose
- Use
discriminatedUnionfor object variants distinguished by a tag field--higher performance, simpler errors, safer exhaustiveness checks. - Use
unionfor heterogeneous unions, non-object branches, or when no single discriminator exists.