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...
