Zod v4

2

🚀 Performance Improvements

Zod v4 delivers significant performance gains:

  • String parsing is up to 2.6 times faster.

  • Array parsing sees a 3x speed increase.

  • Object parsing is up to 7x faster.

  • TypeScript compilation performance has improved, with some operations reducing from 25,000 to 1,100 instantiations.

  • The core bundle size has been reduced by 2x, and the new @zod/mini package offers a 6.6x smaller footprint with functional tree-shaking. Zod+7Medium+7Basic Utils+7


🧩 New Features

1. z.interface() for Recursive Types

Defining recursive schemas is now more straightforward with z.interface(), eliminating the need for z.lazy():GitHub+5Basic Utils+5Medium+5

typescript
CopyEditconst Category = z.interface({
name: z.string(),
get subcategories() {
return z.array(Category);
}
});

This approach simplifies the creation of recursive structures. Basic Utils

2. File Schema Validation

Zod v4 introduces z.file() for validating File instances, allowing constraints on size and MIME type:Zod+3Basic Utils+3Zod+3

typescript
CopyEditconst fileSchema = z.file()
.min(10_000) // Minimum size in bytes
.max(1_000_000) // Maximum size in bytes
.type("image/png"); // MIME type

This feature is particularly useful for handling file uploads. Zod+3Zod+3Basic Utils+3

3. Metadata Registry

A new metadata system allows attaching strongly-typed metadata to schemas without polluting the schema definition itself. Metadata is stored in a separate registry:Zod

typescript
CopyEditimport { z } from "zod/v4";

const myRegistry = z.registry<{ title: string; description: string }>();
const emailSchema = z.string().email();
myRegistry.set(emailSchema, {
title: "Email Address",
description: "A valid email address."
});

This separation enhances modularity and clarity in schema definitions.

4. Internationalization (i18n)

Zod v4 supports locale-based error messages through z.config(), facilitating internationalization:Medium+4Basic Utils+4Zod+4

typescript
CopyEditz.config(z.locales.en()); // Set to English locale

This feature allows developers to provide validation messages in multiple languages. Basic Utils

5. Enhanced Error Handling

The new z.prettifyError() function converts ZodError instances into human-readable strings, improving debugging and user feedback:Basic Utils

typescript
CopyEditconst result = schema.safeParse(data);
if (!result.success) {
console.log(z.prettifyError(result.error));
}

This enhancement streamlines error reporting. Best of JS+11Reddit+11Medium+11


🔁 Migration and Compatibility

To adopt Zod v4, ensure your project is using zod@^3.25.0 or later. Zod v4 is accessible via the /v4 subpath:Hacker News+3Zod+3Zod+3

typescript
CopyEditimport { z } from "zod/v4";

This approach allows for a gradual migration, as Zod v3 and v4 can coexist.


📦 Additional Enhancements

  • z.stringbool(): Converts common truthy and falsy strings into boolean values, simplifying boolean parsing from user input.

  • Improved JSON Schema Conversion: Enhanced compatibility with validation tools and support for frontend-backend schema sharing.

  • Automatic Discriminator Detection: z.discriminatedUnion() now automatically detects the discriminator key, reducing boilerplate. Medium+4Basic Utils+4Zod+4


🎯 Conclusion

Zod v4 represents a significant advancement in schema validation for TypeScript, offering improved performance, enhanced features, and greater flexibility. Whether you're building APIs, forms, or complex data structures, Zod v4 provides the tools to write safer and more maintainable code.Basic Utils

For more information and detailed documentation, visit the official Zod v4 documentation.