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

如何在Zod中扩展对象并从另一对象选取指定属性?

在Zod中合并两个对象Schema(包含嵌套属性+分页参数)

你之前的写法问题在于,Zod的extend方法接收的是字段与对应Zod类型的映射对象,而不是直接传入另一个ZodSchema实例。validation.pick(...)返回的是一个ZodObject,直接传给extend不会被正确解析,所以达不到预期效果。

下面是几种可行的实现方式:

方法1:使用merge方法(推荐)

ZodObject内置了merge方法,可以直接合并两个对象类型的Schema,这是最直观的方式:

const combinedSchema = logValidation.pick({
  level: true,
  event: true,
  userId: true,
  ipAddress: true,
  statusCode: true,
}).merge(validation.pick({ limit: true, offset: true }));

方法2:使用z.intersection

intersection用于合并两个任意类型的Schema,对于对象类型来说,效果和merge一致:

import { z } from "zod";

// 先分别提取需要的部分
const logPartialSchema = logValidation.pick({
  level: true,
  event: true,
  userId: true,
  ipAddress: true,
  statusCode: true,
});
const paginationPartialSchema = validation.pick({ limit: true, offset: true });

// 合并两个Schema
const combinedSchema = z.intersection(logPartialSchema, paginationPartialSchema);

方法3:通过shape属性获取字段定义后extend

如果一定要用extend,可以通过ZodObject的shape属性拿到它的字段映射对象,再传给extend:

const combinedSchema = logValidation.pick({
  level: true,
  event: true,
  userId: true,
  ipAddress: true,
  statusCode: true,
}).extend(validation.pick({ limit: true, offset: true }).shape);

这三种方式都能实现你要的效果:将日志对象的指定属性与分页参数的属性合并成一个新的验证Schema,同时保留各自的验证规则。

内容的提问来源于stack exchange,提问作者hantoren

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:01:03