我的任务是将代码库从使用Joi转换为使用Zod进行TypeScript验证。在这个过程中,我遇到了一个障碍,即在zod库中找到与joi.ref()等效的方法。
const joiParentObject = joi.object({
someKey: joi.string().required()
})
const joiChildObject = joiParentObject.keys({
someChildKey: joi.string().default(joi.ref('someKey'))
})
const zodParentObject = z.object({
someKey: z.string()
})
const zodChildObject = z.object({
someChildKey: z.string().... <---- here
}).merge(zodParentObject)
我尝试过使用不同的对象文字方法,比如function someChildKey() {...}
或get someChildKey(){}
和set someChildKey(){}
,但当使用this.
访问父对象的同级键时,它们都以object is possibly undefined
结束。
1条答案
按热度按时间mefy6pfw1#
换句话说,您希望
someChildKey
是可选的(即string | undefined
),如果它是undefined
,你希望它的值是someKey
?Zod has a
.default()
method,你可以传递一个默认值或一个函数,它的计算结果是默认值,但你不能访问函数中的对象的其他属性。所以在这种情况下,.default()
方法不能使用(但我提到它是因为它在更简单的情况下很有用)。一种解决方案是使用Zod's
.optional()
method将someChildKey
标记为可选,并在使用Zod's.transform()
method解析后为其设置默认值:在
.transform()
中,data
参数是整个对象,所以data.someKey
与Joi.ref('someKey')
有点相同。顺便说一下,Joi的
object.keys()
方法似乎禁止未定义的键。对于类似的效果,您可以使用Zod's.strict()
method。