Búsqueda de sitios web

typescript - Cómo combinar múltiples esquemas Zod (objeto)


Tengo 3 esquemas para una publicación de blog.

  1. Publicación de imagen
  2. Publicación de video
  3. Publicación de texto

El esquema se ve así

// will be used for form validation

// text can be added but image required
const imagePostSchema = z.object({
  body: z.string().max(500).optional().or(z.literal('')),
  attachmentType: z.literal('img'),
  attachment: // z... image validation is here
});

// text can be added but video required
const videoPostSchema = z.object({
  body: z.string().max(500).optional().or(z.literal('')),
  attachmentType: z.literal('video'),
  attachment: // z... video validation is here
});

// text is required & other fields must be null
const textPostSchema = z.object({
  body: z.string().max(500),
  attachmentType: z.null(),
  attachment: z.null()
});

Ahora, ¿cómo fusionar estos esquemas para crear un esquema único, de modo que el usuario pueda hacer cualquier tipo de publicación (de estos 3)?

Respuesta #1

Fusionar en un esquema que acepte "cualquier tipo de estos 3" se realiza mediante una unión de los tres tipos, usando ….or(…) o z.union(…). Sin embargo, dado que esos tipos se deben distinguir según su attachmentType, realmente quieres una unión discriminada que hará que la verificación sea más eficiente:

const postSchema = z.discriminatedUnion("attachmentType", [
  imagePostSchema,
  videoPostSchema,
  textPostSchema,
]);

Respuesta #2

puedes crear un nuevo Esquema combinando todos ellos en uno solo extendiendo esos esquemas en el nuevo

export const formSchema = z.object({
...imagePostSchema.shape,
...videoPostSchema.shape,
...textPostSchema.shape,
});

Artículos relacionados