Mastering Zod Schema Arrays

Mastering Zod Schema Arrays

Zod Schema Arrays

·

5 min read

Zod is a powerful TypeScript-first schema declaration and validation library that simplifies the process of defining and validating data structures. One of the key features of Zod is its ability to handle arrays with ease. In this article, we will delve into the various methods provided by Zod for working with arrays, including .element, .nonempty, .min, .max, and .length. By the end of this article, you will have a comprehensive understanding of how to use these methods to create robust and flexible array schemas.

Introduction to Zod

Zod is designed to be type-safe, easy to use, and highly performant. It provides a rich set of features for defining and validating schemas, making it a powerful tool for developers working with TypeScript. Whether you are validating simple data structures or complex nested objects, Zod has the tools you need to ensure data integrity.

Zod Schema Arrays

.element

The .element method is used to define the schema for the elements of an array. This method ensures that each element in the array conforms to the specified schema.

import { z } from 'zod';

const numberArraySchema = z.array(z.number());

type NumberArray = z.infer<typeof numberArraySchema>;

// Example usage
const validArray: NumberArray = [1, 2, 3, 4];
const invalidArray: NumberArray = [1, 'two', 3]; // This will cause a validation error

In this example, numberArraySchema defines an array where each element must be a number. The z.infer utility type is used to infer the TypeScript type from the schema.

.nonempty

The .nonempty method ensures that the array is not empty. This is useful when you want to validate that an array contains at least one element.

const nonemptyNumberArraySchema = z.array(z.number()).nonempty();

type NonemptyNumberArray = z.infer<typeof nonemptyNumberArraySchema>;

// Example usage
const validArray: NonemptyNumberArray = [1, 2, 3];
const invalidArray: NonemptyNumberArray = []; // This will cause a validation error

Here, nonemptyNumberArraySchema ensures that the array is not empty.

.min / .max / .length

The .min, .max, and .length methods are used to specify the minimum, maximum, and exact length of an array, respectively. These methods provide fine-grained control over the size of the array.

.min

The .min method ensures that the array has at least a certain number of elements.

const minLengthArraySchema = z.array(z.number()).min(3);

type MinLengthArray = z.infer<typeof minLengthArraySchema>;

// Example usage
const validArray: MinLengthArray = [1, 2, 3, 4];
const invalidArray: MinLengthArray = [1, 2]; // This will cause a validation error

In this example, minLengthArraySchema ensures that the array has at least 3 elements.

.max

The .max method ensures that the array has at most a certain number of elements.

const maxLengthArraySchema = z.array(z.number()).max(3);

type MaxLengthArray = z.infer<typeof maxLengthArraySchema>;

// Example usage
const validArray: MaxLengthArray = [1, 2, 3];
const invalidArray: MaxLengthArray = [1, 2, 3, 4]; // This will cause a validation error

Here, maxLengthArraySchema ensures that the array has at most 3 elements.

.length

The .length method ensures that the array has exactly a certain number of elements.

const exactLengthArraySchema = z.array(z.number()).length(3);

type ExactLengthArray = z.infer<typeof exactLengthArraySchema>;

// Example usage
const validArray: ExactLengthArray = [1, 2, 3];
const invalidArray: ExactLengthArray = [1, 2]; // This will cause a validation error

In this example, exactLengthArraySchema ensures that the array has exactly 3 elements.

Practical Examples

Validating a List of Users

Let's create a schema for validating a list of users, where each user has a name, age, and email.

const userSchema = z.object({
  name: z.string(),
  age: z.number(),
  email: z.string().email(),
});

const usersArraySchema = z.array(userSchema).nonempty();

type UsersArray = z.infer<typeof usersArraySchema>;

// Example usage
const validUsers: UsersArray = [
  { name: 'Alice', age: 30, email: 'alice@example.com' },
  { name: 'Bob', age: 25, email: 'bob@example.com' },
];

const invalidUsers: UsersArray = []; // This will cause a validation error

In this example, usersArraySchema ensures that the array is not empty and that each element conforms to the userSchema.

Validating a List of Numbers with Length Constraints

Let's create a schema for validating a list of numbers with specific length constraints.

const constrainedNumberArraySchema = z.array(z.number()).min(2).max(5);

type ConstrainedNumberArray = z.infer<typeof constrainedNumberArraySchema>;

// Example usage
const validArray: ConstrainedNumberArray = [1, 2, 3];
const invalidArray1: ConstrainedNumberArray = [1]; // This will cause a validation error
const invalidArray2: ConstrainedNumberArray = [1, 2, 3, 4, 5, 6]; // This will cause a validation error

In this example, constrainedNumberArraySchema ensures that the array has between 2 and 5 elements.

Conclusion

Zod provides a powerful and flexible way to define and validate array schemas in TypeScript. By using methods like .element, .nonempty, .min, .max, and .length, you can create robust and flexible array schemas that ensure the integrity of your data. Whether you are working with simple arrays or complex nested structures, Zod has the tools you need to validate your data effectively.

By understanding and utilizing these array schema methods, you can enhance the reliability and maintainability of your TypeScript applications. Happy coding!

Additional Resources

To learn more about Zod and its capabilities, you can refer to the official documentation and explore the various examples and use cases provided. The Zod community is also a great resource for getting help and sharing knowledge with other developers.

By leveraging the power of Zod, you can build more reliable and maintainable TypeScript applications. Whether you are validating simple data structures or complex nested objects, Zod has the tools you need to ensure data integrity. Happy coding!