typescript - Zod objekt skjema med nullable felt


Jeg vil definere et Zod-skjema hvor alle egenskapene kan være null. For øyeblikket definerer jeg det som vist nedenfor, og gjentar nullable() for hver egenskap. Finnes det en bedre måte å gjøre dette på uten gjentakelse? PS. Til de som foreslår å bruke .Partial: det gjør IKKE objektfeltene nullable.

const MyObjectSchema = z
  .object({
    p1: z.string().nullable(),
    p2: z.number().nullable(),
    p3: z.boolean().nullable(),
    p4: z.date().nullable(),
    p5: z.symbol().nullable(),
  })
  .partial();

Svar #1

du kan bruke denne funksjonen nedenfor. den gjør alle feltene i zod-objektet nullable og bevarer også felttypene.

function nullable<TSchema extends z.AnyZodObject>(schema: TSchema) {
    const entries = Object.entries(schema.shape) as [keyof TSchema['shape'], z.ZodTypeAny][];

    const newProps = entries.reduce((acc, [key, value]) => {
        acc[key] = value.nullable();
        return acc;
    }, {} as {
        [key in keyof TSchema['shape']]: z.ZodNullable<TSchema['shape'][key]>
    });

    return z.object(newProps)
}

bruk:

nullable(
  z.object({
    field1: z.string(),
    field2: z.number()
  }),
)

Relaterte artikler