[Zod] Use Zod Schemas partially using shape and unwrap
Instead of creating many small schemas, which can complicate maintenance, Zod allows for the extraction of specific parts of a schema using the concept of ".shape". It "unwraps" the object schema, enabling access to sub-schemas within specific properties.
Additionally, we can use the .unwrap
to get into element schemas of altered schemas such as .optional
or .array
.
Simplify working with complex schemas without the need to break them into hundreds of small schemas.
import { z } from 'zod'
const roomBookingSchema = z.object({
roomType: z.literal('suite'),
dueDate: z.string().date(),
numberOfGuests: z.number().min(1).max(4),
price: z.number().positive(),
amenities: z.array(z.string()).optional(),
guestDetails: z.array(
z.object({
name: z.string(),
age: z.number().min(0),
email: z.string().email(),
})
),
})
Schema vs Shape
Schema is mainly use for validation. But you are NOT able to do roomBookingSchema.roomType
Using shape, we are able to access each prop:
const roomBookingShape = roomBookingSchema.shape
// .array(), need to use .element to get the Object schema inside array
const guestDetailsSchema = roomBookingShape.guestDetails.element
type GuestDetails = z.infer<typeof guestDetailsSchema>
type GuestDetails_ = z.infer<typeof guestDetailsSchema>['guestDetails'][number]
// .array().optional(), for optional() we need to use unwrap() first to get z.string()
const amenitiesElementSchema = roomBookingShape.amenities.unwrap().element