javascript - Hvordan definere typen for en null-verdi med skjema fra Zod


Jeg har en type definert med zod.

Jeg er uerfaren med TypeScript.

Zod-objektet ser slik ut:

import z from 'zod';
const clientSchema = z.object({
  name: z.string(),
  details: z.object({
    detail1: z.string().optional()
    }
  }
);
export type ClientSchema = z.infer<typeof clientSchema>;

Tildele details til en client av typen ClientSchema, håpet jeg å kunne annotere typen slik:

const details = {
  detail1: <string|null|undefined> ''
}

Men TypeScript klager:

Typer av eiendom 'detail1' er inkompatible. Type 'string | undefined' kan ikke tilordnes typen 'string'. Type 'undefined' kan ikke tilordnes typen 'string'.

Så nå har jeg laget et eget skjema for detaljer:

export const detailSchema = z.object({
    detail1: z.string().optional() ,
});
export type DetailSchema = z.infer<typeof detailSchema>;

Og deretter deklarer objektet:

const details: DetailSchema = {
  detail1: 'a string'
}

Er det den forventede/anbefalte tilnærmingen for underobjekter?

Svar #1

Du kan også ha nullable-objekter, hvis du ønsker at en egenskap skal være null eller undefined, kan du gjøre

property: z.string().nullable().optional(), i ditt tilfelle vil dette være:

const clientSchema = z.object({
  name: z.string(),
  details: z.object({
    detail1: z.string().nullable().optional()
  })
});

Som burde gi deg

type ClientSchema = {
    name: string;
    details: {
        detail1?: string | null | undefined;
    };
}

Fra dette kan du ekstrapolere detaljer-skjemaet som

type DetailSchema = ClientSchema["details"];

som vil gi deg

type DetailSchema = {
    detail1?: string | null | undefined;
}

Som du kan bruke som følger:

const details: DetailsSchema = {
  details1: ""  // string | null | undefined
}

Relaterte artikler