Website-Suche

typescript - .passthrough() rekursiv auf ein zod-Schema anwenden


Ich arbeite mit einer API, die komplexe verschachtelte Datenstrukturen zurückgeben kann und sich oft ändert (neue Daten werden hinzugefügt, ...).

Ich möchte validieren, dass die API ein minimales Set an Eigenschaften zurückgibt, möchte aber auch alle anderen Attribute beibehalten (der Code sollte die Daten abrufen/aktualisieren/zurücksenden).

Deshalb verwende ich .passthrough() in meinem Schema.

Dies funktioniert gut, erfordert jedoch, dass .passthrough() auf jedem inneren Schema einzeln aufgerufen wird, um keine zusätzlichen Eigenschaften zu verlieren.

Beispiel :

/* 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

Meine Frage ist: Gibt es eine (einfache) Möglichkeit, entweder .passthrough() rekursiv anzuwenden oder ein Standardverhalten von Zod festzulegen?

PS: vollständige Reproduktion: https://codesandbox.io/s/crazy-kilby-4mf4yr?file=/src/index.ts

Ich habe versucht, eine Hilfsdatei wie folgt hinzuzufügen:

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

aber irgendetwas stimmt nicht in meiner Syntax (nicht sicher was)

Verwandte Artikel