簡體   English   中英

如何在 Zod 中創建具有默認值的可選屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM