Zod能否重塑输入对象并重命名属性键?求实现方法
解决方案
要实现把category字段替换成categoryId的需求,你需要在整个对象Schema层面使用transform,而不是只在category字段上做转换。字段级的transform只能修改对应字段的值,没法改变字段名,所以得在整体转换时重新构造输出对象。
直接上可行的代码:
import { z } from "zod"; const ArticleSchema = z.object({ title: z.string().min(5), body: z.string().min(5), // 先验证category的结构是否符合要求 category: z.object({ id: z.number().int(), name: z.string(), }), // 对整个对象做转换:解构出category和其他字段,重构为带categoryId的新对象 }).transform(({ category, ...rest }) => ({ ...rest, categoryId: category.id, }));
测试示例:
const inputData = { title: "My title", body: "My body", category: { id: 1, name: "My category" } }; const parsedResult = ArticleSchema.parse(inputData); // 输出结果:{ title: "My title", body: "My body", categoryId: 1 }
这个方案既完成了原数据的结构验证(比如title/body的长度、category.id是整数),又把输出结构改成了你想要的样子。如果输入数据不符合验证规则(比如title长度不够、category.id不是整数),Zod依然会抛出对应的验证错误,完全不影响原有校验逻辑。
内容的提问来源于stack exchange,提问作者caseyf
相关产品推荐
相关产品推荐

