typescript - Cómo combinar múltiples esquemas Zod (objeto)
Tengo 3 esquemas para una publicación de blog.
- Publicación de imagen
- Publicación de video
- 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,
});