如何在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
相关产品推荐
相关产品推荐

