typescript - Zod-schema för en sträng som börjar med en bokstav


Jag har denna typ i TypeScript, där strängen måste börja med bokstaven A.

type StringStartsWithA = `A${string}`

När jag vill skapa ett zod-schema, är det det jag använder:

const StringStartsWithASchema = z.string().startsWith("A")

Men då är den härledda typen bara en vanlig sträng.

type StringStartsWithA = z.infer<typeof Schema> // string

Finns det ett sätt att lösa detta, så att den härledda typen också måste börja med bokstaven A? Så att den matchar den ursprungliga TypeScript-typen?

Svar #1

Från dokumenten

Du kan skapa ett Zod-schema för vilken TypeScript-typ som helst genom att använda z.custom(). Detta är användbart för att skapa scheman för typer som inte stöds av Zod direkt, såsom mallsträngslitteraler.

const px = z.custom<`${number}px`>((val) => /^\d+px$/.test(val));
px.parse("100px"); // pass
px.parse("100vw"); // fail

Så, för din situation:

const StringStartsWithA = z.custom<`A${string}`>((val: any) => /^A/.test(val));
type StringStartsWithA = z.infer<typeof StringStartsWithA> // type StringStartsWithA = `A${string}`

Svar #2

du kan också göra följande

const px = z.string().endsWith('px').and(z.custom<`${string}px`>());
px.parse('100px'); // pass
// px.parse('100vw'); // fail

vilket också låter dig fortsätta använda strängverktyg som .max, .length, etc...