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

