如何用Zod验证含可选属性但至少有一个属性的TypeScript对象
使用Zod验证带可选属性但非空的对象
你需要验证一个所有属性都可选,但必须至少包含一个属性的对象,之前的Zod Schema会允许空对象通过,这可以通过Zod的refine方法添加自定义验证逻辑来解决。
方案实现
定义Schema
结合z.object定义可选属性,再通过refine检查对象是否非空:
import { z } from "zod"; const MyObjectSchema = z.object({ prop1: z.string().optional(), prop2: z.number().optional(), // 可继续添加更多可选属性 }).refine( (obj) => Object.keys(obj).length > 0, "对象必须至少包含一个属性" ); // 自动推导对应的TypeScript类型 type MyObject = z.infer<typeof MyObjectSchema>;
验证示例
测试不同输入的验证结果:
// 验证通过:包含合法的prop1 const validObj1 = MyObjectSchema.parse({ prop1: "test" }); console.log(validObj1); // { prop1: "test" } // 验证通过:包含合法的prop2 const validObj2 = MyObjectSchema.parse({ prop2: 123 }); console.log(validObj2); // { prop2: 123 } // 验证失败:空对象 try { const invalidObj = MyObjectSchema.parse({}); } catch (error) { console.error(error.message); // "对象必须至少包含一个属性" } // 验证失败:属性类型不匹配 try { const invalidObj = MyObjectSchema.parse({ prop2: "not a number" }); } catch (error) { console.error(error.message); // "prop2必须是数字类型" }
原理说明
z.object负责定义对象的结构规则,所有属性标记为optional(),允许单个或多个属性存在或缺失。refine方法添加自定义校验逻辑:通过Object.keys(obj).length > 0判断对象是否包含至少一个有效属性,不满足时返回自定义错误提示。
内容的提问来源于stack exchange,提问作者Mustafa Ahmed Mohammed
相关产品推荐
相关产品推荐

