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()
}),
)
