[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

 

posted @ 2025-03-04 14:42  Zhentiw  阅读(46)  评论(0)    收藏  举报