suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Wie mache ich alle Eigenschaften im Zod-Schema optional, basierend auf einem bestimmten Produktverfügbarkeitsflag?

<p>Ich habe ein Zod-Schema zur Validierung von Produktattributen für eine E-Commerce-Anwendung. In meinem Schema habe ich derzeit ein Attribut namens <code>isLimitedEdition</code>, das angibt, ob das Produkt nur begrenzt verfügbar ist. Wenn jedoch <code>isLimitedEdition</code> auf true gesetzt ist, möchte ich, dass alle anderen Eigenschaften im Schema optional werden. </p> <p>Dies ist die bestehende Architektur:</p> <pre class="brush:php;toolbar:false;">const productProperties = z.object({ Name: z.string().nonempty(), Beschreibung: z.string().nonempty(), Preis: z.number().positive(), Kategorie: z.string().nonempty(), Marke: z.string().nonempty(), isFeatured: z.boolean().default(false), isLimitedEdition: z.boolean().default(false), });</pre> <p>In dieser Architektur möchte ich ein Verhalten implementieren, bei dem alle Eigenschaften (Name, Beschreibung, Preis, Kategorie, Marke, isFeatured) optional werden, wenn isLimitedEdition auf true gesetzt ist. </p> <p>Wie kann ich dieses Schema ändern, um das gewünschte Verhalten zu erreichen? Ich wäre dankbar für jede Anleitung oder Codebeispiele, die mir dabei helfen, diese Logik korrekt zu implementieren. Vielen Dank im Voraus! </p> <p>Ich habe die Methode <code>refine</code> ohne Erfolg ausprobiert</p>
P粉298305266P粉298305266494 Tage vor485

Antworte allen(1)Ich werde antworten

  • 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) }),
    ])

    Antwort
    0
  • StornierenAntwort