[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 @   Zhentiw  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
历史上的今天:
2024-03-04 [Rust] ref keyword for borrow value
2024-03-04 [Rust] if let & while let
2024-03-04 [Rust] Using .map_err instead of wrap which cause panic
2024-03-04 [Rust] Using Box<dyn error::Error>> return one of miultiple error types at runtime
2022-03-04 [AWS Explained] Security
2020-03-04 [AST Babel] Babel Template
2020-03-04 [HTML5] Layout Reflow & thrashing
点击右上角即可分享
微信分享提示