如何用Zod Schema定义bigint、number或undefined类型字段?无对应字段时出现TypeError报错求助
如何用Zod Schema定义bigint、number或undefined类型字段?无对应字段时出现TypeError报错求助
看起来你遇到的是一个很容易踩的小坑,让我帮你梳理问题并解决:
问题根源
你在OrderDetailsSchema里写了z.IdNumberSchemaNullable,但IdNumberSchemaNullable是你自己定义的Schema变量,并不是Zod内置的方法(z对象上根本没有这个属性)。这就导致z.IdNumberSchemaNullable的值是undefined,当Zod尝试解析这个字段时,会去读取undefined的_parse方法,直接抛出了你看到的TypeError。
修正后的代码
只需要去掉z.前缀,直接使用你定义好的Schema变量就行:
const IdNumberSchemaNullable = z.union([ z.number().nonnegative().optional(), // 支持非负number和undefined z.bigint().nonnegative(), // 支持非负bigint z.undefined() ]); const OrderDetailsSchema = BaseSchema.extend({ _t: z.literal('my_something'), id_test: IdNumberSchemaNullable, // 这里直接用自定义变量名,不要加z.前缀 });
额外优化建议
其实你的Schema还能更简洁:z.union里的z.undefined()和z.number().nonnegative().optional()的optional()功能重复了,因为optional()本身就允许字段为undefined。你可以把Schema改成下面这样,效果完全一致但代码更清爽:
const IdNumberSchemaNullable = z.union([ z.number().nonnegative(), z.bigint().nonnegative() ]).optional();
这样定义后,id_test字段就完美支持三种情况:非负number、非负bigint,或者字段不存在/值为undefined。
备注:内容来源于stack exchange,提问作者vladaman
相关产品推荐
相关产品推荐

