![](/img/trans.png)
[英]Zod Schema: How to make a field optional OR have a minimum string contraint?
[英]How to make an optional property with a default value in Zod
我正在使用Zod ,我想為用戶輸入定義一個模式,該模式具有一個帶有默認值的可選字段。 但是,我不可能使運行時行為與推斷的類型相匹配。 我想要的是該字段是可選的,當未提供或未定義提供時,使用默認值。 如果我想要這種行為,我不能在生成的類型中擁有可選的字段,並且如果我設法在生成的類型中使其成為可選,那么它在運行時將不會獲得默認值。
讓我用代碼解釋一下:
import { Timestamp } from 'firebase/firestore';
import { z } from 'zod';
export const someSchema = z.object({
id: z.string(),
timestamp: z.instanceof(Timestamp),
type: z.enum(['fever', 'constipation']),
notes: z.string().optional().default(''),
});
export const someInput = someSchema
.omit({ id: true })
.merge(
z.object({
timestamp: z
.date()
.optional()
.default(() => new Date()),
}),
)
.partial({
notes: true,
});
export const schemaArray = z.array(someSchema);
export type Schema = z.infer<typeof someSchema>;
export type SchemaInput = z.infer<typeof someInput>; // <- Here I expect timestamp to be optional, but it is required
function a({ type, timestamp, notes}: SchemaInput){
someInput.parse({
type, timestamp, notes
})
}
a({type: 'fever'}) <- Error, timestamp is required
正如我在 github 上指出的那樣,模式通常具有輸入和輸出類型。 默認情況下, z.infer
所做的是返回輸出類型,這可能是最常見的使用場景。 值得慶幸的是,還有一種方法可以為解析器提取預期輸入,而這正是我所需要的:
export type SchemaInput = z.input<typeof someInput>;
function a({ type, timestamp, notes}: SchemaInput){
someInput.parse({
type, timestamp, notes
})
現在推斷的架構如下所示:
type SchemaInput = {
timestamp?: Date | undefined;
notes?: string | undefined;
type: "fever" | "constipation";
}
這正是我需要的一個函數,它接受這個輸入並使用驗證器來確保它具有正確的格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.