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

如何从Zod Schema根据默认值生成对应原生对象实例?

实现方案

Zod原生就支持生成默认实例的能力,不需要额外引入第三方工具,注意你当前写的Schema存在两个小问题会影响结果生成:

  • age: z.number().nullable() 仅表示该字段允许值为null,不代表字段可选、也不会自动设置默认值为null,直接解析空对象会触发必填校验报错
  • 原Schema里nullable()结尾的分号是语法笔误,需要改成逗号

方案1:调整Schema配置(推荐)

给age字段补充默认值null,之后直接调用parse方法传入空对象,就能得到你要的原生对象结构,后续Schema调整默认值时生成的实例会自动同步,不需要额外维护逻辑:

import { z } from "zod";

const Person = z.object({
    name: z.string().default(''),
    age: z.number().nullable().default(null),
});

const InstancePerson = Person.parse({});
// 运行结果:{ name: '', age: null } 和目标结构完全一致

方案2:不修改原Schema,通过遍历shape生成实例

如果你不想调整原有Schema的校验规则(比如要求age字段在实际校验时必须显式传入,不能缺失),可以写一个简单的工具函数遍历Zod Object的shape定义,自动提取默认值、给nullable类型字段补null生成实例:

import { z } from "zod";

const Person = z.object({
    name: z.string().default(''),
    age: z.number().nullable(),
});

function getSchemaDefaultInstance(schema) {
    const instance = {};
    const shape = schema.shape;
    for (const [fieldKey, fieldSchema] of Object.entries(shape)) {
        // 优先取字段显式配置的default值
        let fieldValue = fieldSchema._def.default;
        // 无默认值时如果字段是nullable类型,默认赋值null
        if (fieldValue === undefined && fieldSchema instanceof z.ZodNullable) {
            fieldValue = null;
        }
        // 其余基础类型如果需要补默认值可以在这里自行扩展逻辑
        instance[fieldKey] = fieldValue;
    }
    return instance;
}

const InstancePerson = getSchemaDefaultInstance(Person);
// 运行结果:{ name: '', age: null }

注意:方案2里访问_def属于读取Zod的内部属性,大版本升级时如果内部结构变更可能需要适配,优先用方案1的原生parse逻辑最稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:12:22