Búsqueda de sitios web

javascript - ¿Cómo validar un campo en Zod dependiendo del valor de otro campo?


Tengo un esquema y necesito hacer que el campo role solo se valide cuando el valor del campo subject sea 1, de lo contrario, el role no debe validarse en absoluto

const schema = z.object({
  subject: z.number().default(0),
  gender: z.object({
    owner: z.number(),
    stranger: z.number().array().min(1),
  }),
  age: z.object({
    owner: z.number(),
    stranger: z.number().array().min(1),
  }),
  role: z.object({
    owner: z.number(),
    stranger: z.number(),
  }),
});

Intenté usar el método refine pero fue infructuoso. En todos los ejemplos de código que vi, el refine solo procesaba el campo en el que se llamaba este método. En mi caso, necesito procesar otro campo

Respuesta #1

Puedes manejar dicha validación condicional usando .refine(validator: (data:T)=>any, params?: RefineParams) - aquí

Implementación de ejemplo:

const schema = z.object({
  subject: z.number().default(0),
  role: z.object({
    owner: z.number(),
    stranger: z.number(),
  }),
}).refine(data => data.subject !== 1 || (data.subject === 1 && data.role), {
  message: "Role field is required when subject equals 1",
  path: ['role'] // Pointing out which field is invalid
});

Artículos relacionados