When using the schema z.union([z.object({}), anotherSchema.partial()]);
, Zod checks if the object matches the empty object {}
first.
Since an empty object can always be valid, Zod might decide that the object matches {}
and stops there, ignoring the other options in the union.
To fix this, you should ensure that Zod prioritizes the more specific schema (anotherSchema.partial()
) over the empty object. You can achieve this by reversing the order in the union.
For example:
import { z } from "zod"; // Define two schemas const emptySchema = z.object({}); const anotherSchema = z.object({ name: z.string(), age: z.number().optional(), }); // Create a union where the empty schema is checked first const problematicSchema = z.union([emptySchema, anotherSchema.partial()]); // Test with an object that should match `anotherSchema.partial()` const data = { name: "myName" }; const result = problematicSchema.safeParse(data); console.log(result);
The output is
{ success: true, data: {} }
Instead of
{ success: true, data: { name: "myName" } }
Top comments (0)