node.js - Array av seg selv i Zod-skjema


Jeg ønsker å oppnå følgende:

export const MediaResponseSchema = z.object({
    mediaId: z.number(),
    childMedias: z.array(z.object(MediaResponseSchema)),
});

Det vil si at childMedia bør parses som et array av skjemaet jeg erklærer.

Svar #1

Jeg tror kommentaren som nevner rekursive typer er korrekt, men for å fullt ut illustrere hva som menes, kan du bruke z.lazy, og deretter referere til skjemaet innenfor definisjonen. Ditt eksempel vil bli:

import { z } from "zod";

// Zod won't be able to infer the type because it is recursive.
// if you want to infer as much as possible you could consider using a
// base schema with the non-recursive fields and then a schema just for
// the recursive parts of your schema and use `z.union` to join then together.
interface IMediaResponse {
  mediaId: number;
  childMedias: IMediaResponse[];
}

const MediaResponseSchema: z.ZodType<IMediaResponse> = z.lazy(() =>
  z.object({
    mediaId: z.number(),
    childMedias: z.array(MediaResponseSchema)
  })
);

Se Zod-dokumentasjonen på GitHub, selv om jeg tror dette burde være ekvivalent med det som ble lenket.

Bare for å svare på denne kommentaren:

Hva er forskjellen mellom det og å kopiere-lime inn hele zod-objektet?

En viktig forskjell er at dette vil gjenta seg uendelig. childMedia kan være vilkårlig nestet med sine egne underordnede medier. Hvis du bare kopierer og limer inn, ender du opp med bare ett ekstra nivå av rekursjon, og du står igjen med det samme problemet du startet med når du prøver å bestemme hva du skal putte inn i childMedias som du limte inn.

Relaterte artikler