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)

Relaterte artikler