Zod结合Fastify:如何生成含指定嵌套字段的用户注册响应Schema?
在Fastify中使用Zod创建嵌套字段过滤的响应Schema
问题场景
你已经定义了包含username(字符串类型)和device(DeviceModel对象,包含name、id、verified字段)的UserModel,需要生成用户注册响应的Schema(UserSignUpResponse):保留username,同时只保留device中的id和name,排除verified字段。但直接在pick中嵌套处理device字段的方式无法生效。
解决方案
Zod的pick方法仅支持当前层级的字段选择,无法直接处理嵌套对象的字段筛选。你可以通过先选取顶层字段,再用extend重新定义嵌套字段的方式实现需求,具体有两种写法:
方式1:用pick选取device需要的字段
import { z } from 'zod'; // 原Schema定义 const DeviceModel = z.object({ name: z.string(), id: z.string(), verified: z.boolean() }); const UserModel = z.object({ username: z.string(), device: DeviceModel }); // 生成响应Schema const UserSignUpResponse = UserModel.pick({ username: true }).extend({ device: DeviceModel.pick({ id: true, name: true }) });
方式2:用omit排除device不需要的字段
如果需要排除的字段更少,用omit会更简洁:
const UserSignUpResponse = UserModel.pick({ username: true }).extend({ device: DeviceModel.omit({ verified: true }) });
原理说明
UserModel.pick({ username: true })会生成一个仅包含username字段的Schema;- 调用
extend方法可以为这个Schema添加/覆盖字段,这里我们重新定义device字段为经过pick/omit处理后的DeviceModel,从而实现嵌套字段的筛选。
内容的提问来源于stack exchange,提问作者Louis Loiseau-Billon
相关产品推荐
相关产品推荐

