You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:32:03