Enums, Unions & Combinators
String enums, TypeScript enums, standard unions, discriminated unions, and recursive lazy schemas.
String & Native Enums
Create string enums with quick property lookup and subset extraction:
Schema Definition
// String Enum
const Roles = infer.enum(["ADMIN", "EDITOR", "VIEWER"]);
Roles.enum.ADMIN; // "ADMIN"
const SubRoles = Roles.extract(["ADMIN", "EDITOR"]);
// Native Enum
enum Status { Active = "ACTIVE", Inactive = "INACTIVE" }
const StatusSchema = infer.nativeEnum(Status);O(1) Discriminated Unions
Discriminated unions look up the branch by key in O(1) time without running every candidate branch:
Schema Definition
const EventSchema = infer.discriminatedUnion("type", [
infer.object({ type: infer.literal("click"), x: infer.number(), y: infer.number() }),
infer.object({ type: infer.literal("hover"), target: infer.string() }),
infer.object({ type: infer.literal("scroll"), offset: infer.number() })
]);Intersections & Recursive Lazy
Combine shapes with infer.intersection or define recursive data structures with infer.lazy:
Schema Definition
// Recursive linked list / tree
interface TreeNode {
value: number;
next?: TreeNode;
}
const NodeSchema: infer.Schema<TreeNode> = infer.lazy(() =>
infer.object({
value: infer.number(),
next: NodeSchema.optional()
})
);