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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:15:15