首頁  >  問答  >  主體

如何根據特定產品可用性標誌使 Zod 架構中的所有屬性可選?

<p>我有一個 Zod 架構,用於驗證電子商務應用程式的產品屬性。在我的架構中,我目前有一個名為 <code>isLimitedEdition</code> 的屬性,它指示產品是否限量供應。但是,當 <code>isLimitedEdition</code> 設定為 true 時,我希望架構中的所有其他屬性都變成可選。 </p> <p>這是現有的架構:</p> <pre class="brush:php;toolbar:false;">const productProperties = z.object({ name: z.string().nonempty(), description: z.string().nonempty(), price: z.number().positive(), category: z.string().nonempty(), brand: z.string().nonempty(), isFeatured: z.boolean().default(false), isLimitedEdition: z.boolean().default(false), });</pre> <p>在此架構中,我希望實現一種行為:如果 isLimitedEdition 設定為 true,則所有屬性(名稱、描述、價格、類別、品牌、isFeatured)都變為可選。 </p> <p>如何修改此架構以實現所需的行為?我將不勝感激任何指導或程式碼範例來幫助我正確實現這個邏輯。預先感謝您! </p> <p>我試了<code>refine</code>方法,但沒有成功</p>
P粉298305266P粉298305266416 天前394

全部回覆(1)我來回復

  • P粉225961749

    P粉2259617492023-08-31 17:26:21

    您可以使用 discriminatedUnion 來實現此目的:

    const productProperties = z.object({
      name: z.string().nonempty(),
      description: z.string().nonempty(),
      price: z.number().positive(),
      category: z.string().nonempty(),
      brand: z.string().nonempty(),
      isFeatured: z.boolean().default(false),
    })
    
    const product = z.discriminatedUnion('isLimitedEdition', [
      productProperties.extend({ isLimitedEdition: z.literal(false) }),
      productProperties.partial().extend({ isLimitedEdition: z.literal(true) }),
    ])

    回覆
    0
  • 取消回覆