Maison  >  Questions et réponses  >  le corps du texte

Comment rendre toutes les propriétés du schéma Zod facultatives en fonction d'un indicateur de disponibilité de produit spécifique ?

<p>J'ai un schéma Zod pour valider les attributs de produit pour une application de commerce électronique. Dans mon schéma, j'ai actuellement un attribut appelé <code>isLimitedEdition</code> qui indique si le produit est en quantité limitée. Cependant, lorsque <code>isLimitedEdition</code> est défini sur true , je souhaite que toutes les autres propriétés du schéma deviennent facultatives. </p> <p>Voici l'architecture existante :</p> <pre class="brush:php;toolbar:false;">const productProperties = z.object({ nom : z.string().nonempty(), description : z.string().nonempty(), prix : z.number().positive(), catégorie : z.string().nonempty(), marque : z.string().nonempty(), isFeatured : z.boolean().default(false), isLimitedEdition : z.boolean().default(false), });</pré> <p>Dans cette architecture, je souhaite implémenter un comportement dans lequel si isLimitedEdition est défini sur true, toutes les propriétés (nom, description, prix, catégorie, marque, isFeatured) deviennent facultatives. </p> <p>Comment puis-je modifier ce schéma pour obtenir le comportement souhaité ? Je serais reconnaissant pour toute orientation ou exemple de code pour m'aider à mettre en œuvre cette logique correctement. Merci d'avance! </p> <p>J'ai essayé la méthode <code>refine</code> sans succès</p>
P粉298305266P粉298305266416 Il y a quelques jours392

répondre à tous(1)je répondrai

  • P粉225961749

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

    Vous pouvez utiliser discriminatedUnion pour y parvenir :

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

    répondre
    0
  • Annulerrépondre