是否可以使用可能的字段定义 Zod 模式undefined
,但不是可选的。在 TypeScript 中,这是以下之间的区别:
interface IFoo1 {
somefield: string | undefined;
}
interface IFoo2 {
somefield?: string | undefined;
}
const schema = z.object({
somefield: z.union([z.string(), z.undefined()]),
}); // Results in something like IFoo2
据我所知使用z.union([z.string(), z.undefined()])
or z.string().optional()
该字段的结果等于IFoo2
.
我想知道是否有一种方法可以指定行为类似于IFoo1
.
背景/理由
我可能想做这样的事情的原因是迫使开发人员思考该领域是否应该undefined
。当该字段是可选的时,在构造该类型的对象时可能会意外丢失该字段。一个具体的例子可能是这样的:
interface IConfig {
name: string;
emailPreference: boolean | undefined;
}
enum EmailSetting {
ALL,
CORE_ONLY,
}
function internal(config: IConfig) {
return {
name: config.name,
marketingEmail: config.emailPreference ? EmailSetting.ALL : EmailSetting.CORE_ONLY,
}
}
export function signup(userName: string) {
post(internal({ name: userName }));
}
这是一个人为的示例,但这种情况在我们的 React props 代码库中经常发生。允许价值存在的想法undefined
但不可选择的是强制调用者指定,例如,没有指定首选项与选择“是”或“否”。在示例中,我希望在调用时出现错误internal
因为我希望呼叫者考虑电子邮件偏好。理想情况下,这里的类型错误会让我意识到我应该要求电子邮件首选项作为参数signup
.