typescript - Anvend .passthrough() rekursivt på et zod-skjema
Jeg jobber med en API som kan returnere komplekse, nestede datastrukturer og som ofte endres (legg til nye data, ...).
Jeg vil validere at API-et returnerer et minimalt sett med egenskaper, men ønsker også å bevare alle andre attributter (koden skal hente/oppdatere/sende tilbake dataene).
Derfor bruker jeg .passthrough() i skjemaet mitt.
Dette fungerer bra, men krever at man kaller .passthrough() på hvert indre skjema én etter én for å ikke miste ekstra egenskaper.
Eks :
/* sample data*/
const someObjectFromAnApi = JSON.parse(`{
"coords": { "x": 42, "y": 0, "z": 30 },
"color": { "r": 20, "g": 30, "b": 30, "alpha": 0.5 },
"description": "This is here"
}`);
/* /sample data*/
const dataSchema = z
.object({
coords: z
.object({
x: z.number(),
y: z.number()
// I don't need `z`
})
.passthrough(), // 1st passthrough
color: z
.object({
r: z.number(),
g: z.number(),
b: z.number()
// I don't need 'alpha'
})
.passthrough() // 2nd passthrough
})
// I don't need 'description'
.passthrough(); //3rd passthrough
Mitt spørsmål er: finnes det noen (enkel) måte å enten bruke .passthrough() rekursivt eller sette noen standard zod-oppførsel?
PS: full repro: https://codesandbox.io/s/crazy-kilby-4mf4yr?file=/src/index.ts
Jeg prøvde å legge til en hjelpefil på denne måten:
import { z, ZodType } from 'zod';
type ZObject = typeof z.object;
declare module 'zod' {
export interface ZodType {
objectPassthrougth : ZObject;
}
}
z.ZodObject.prototype.objectPassthrougth = function(shape, params){
return z.object(shape,params).passthrough();
}
const schema =
z.objectPassthrougth({
some : z.string()
})
men noe er galt i min syntaks (ikke sikker på hva)