assignability.test.ts•3.3 kB
import { test } from "vitest";
import * as z from "zod/v4-mini";
test("assignability", () => {
  // $ZodString
  z.string() satisfies z.core.$ZodString;
  // $ZodNumber
  z.number() satisfies z.core.$ZodNumber;
  // $ZodBigInt
  z.bigint() satisfies z.core.$ZodBigInt;
  // $ZodBoolean
  z.boolean() satisfies z.core.$ZodBoolean;
  // $ZodDate
  z.date() satisfies z.core.$ZodDate;
  // $ZodSymbol
  z.symbol() satisfies z.core.$ZodSymbol;
  // $ZodUndefined
  z.undefined() satisfies z.core.$ZodUndefined;
  // $ZodNullable
  z.nullable(z.string()) satisfies z.core.$ZodNullable;
  // $ZodNull
  z.null() satisfies z.core.$ZodNull;
  // $ZodAny
  z.any() satisfies z.core.$ZodAny;
  // $ZodUnknown
  z.unknown() satisfies z.core.$ZodUnknown;
  // $ZodNever
  z.never() satisfies z.core.$ZodNever;
  // $ZodVoid
  z.void() satisfies z.core.$ZodVoid;
  // $ZodArray
  z.array(z.string()) satisfies z.core.$ZodArray;
  // $ZodObject
  z.object({ key: z.string() }) satisfies z.core.$ZodObject;
  // $ZodUnion
  z.union([z.string(), z.number()]) satisfies z.core.$ZodUnion;
  // $ZodIntersection
  z.intersection(z.string(), z.number()) satisfies z.core.$ZodIntersection;
  // $ZodTuple
  z.tuple([z.string(), z.number()]) satisfies z.core.$ZodTuple;
  // $ZodRecord
  z.record(z.string(), z.number()) satisfies z.core.$ZodRecord;
  // $ZodMap
  z.map(z.string(), z.number()) satisfies z.core.$ZodMap;
  // $ZodSet
  z.set(z.string()) satisfies z.core.$ZodSet;
  // $ZodLiteral
  z.literal("example") satisfies z.core.$ZodLiteral;
  // $ZodEnum
  z.enum(["a", "b", "c"]) satisfies z.core.$ZodEnum;
  // $ZodPromise
  z.promise(z.string()) satisfies z.core.$ZodPromise;
  // $ZodLazy
  const lazySchema = z.lazy(() => z.string());
  lazySchema satisfies z.core.$ZodLazy;
  // $ZodOptional
  z.optional(z.string()) satisfies z.core.$ZodOptional;
  // $ZodDefault
  z._default(z.string(), "default") satisfies z.core.$ZodDefault;
  // $ZodTemplateLiteral
  z.templateLiteral([z.literal("a"), z.literal("b")]) satisfies z.core.$ZodTemplateLiteral;
  // $ZodCustom
  z.custom<string>((val) => typeof val === "string") satisfies z.core.$ZodCustom;
  // $ZodTransform
  z.transform((val) => val as string) satisfies z.core.$ZodTransform;
  // $ZodNonOptional
  z.nonoptional(z.optional(z.string())) satisfies z.core.$ZodNonOptional;
  // $ZodReadonly
  z.readonly(z.object({ key: z.string() })) satisfies z.core.$ZodReadonly;
  // $ZodNaN
  z.nan() satisfies z.core.$ZodNaN;
  // $ZodPipe
  z.pipe(z.unknown(), z.number()) satisfies z.core.$ZodPipe;
  // $ZodSuccess
  z.success(z.string()) satisfies z.core.$ZodSuccess;
  // $ZodCatch
  z.catch(z.string(), "fallback") satisfies z.core.$ZodCatch;
  // $ZodFile
  z.file() satisfies z.core.$ZodFile;
});
test("assignability with type narrowing", () => {
  type _RefinedSchema<T extends z.ZodMiniType<object> | z.ZodMiniUnion> = T extends z.ZodMiniUnion
    ? RefinedUnionSchema<T> // <-- Type instantiation is excessively deep and possibly infinite.
    : T extends z.ZodMiniType<object>
      ? RefinedTypeSchema<z.output<T>> // <-- Type instantiation is excessively deep and possibly infinite.
      : never;
  type RefinedTypeSchema<T extends object> = T;
  type RefinedUnionSchema<T extends z.ZodMiniUnion> = T;
});