Zod — это библиотека проверки схемы, основанная на TypeScript, со статическим выводом типа из объекта схемы. Проверка во время выполнения и во время компиляции.

Работа с данными является обычной деятельностью в процессе разработки. Чтобы знать, что передаваемые данные соответствуют требуемой форме, мы можем использовать библиотеку схемы. Их задача состоит в том, чтобы проанализировать и проверить правильность данных, поступающих в нашу систему. Это может помочь вам избежать и поймать ошибки. Самыми популярными являются Yup и Joi. Но у обоих есть недостатки.

А вот и библиотека под названием — ZOD. Рассмотрим некоторые преимущества и примеры.

Преимущества

Как я упоминал ранее, библиотеки проверки схемы действительно полезны, но ZOD поразил меня несколькими преимуществами, такими как:

  • Максимально удобный для разработчиков
  • Крошечная библиотека без зависимостей с широкой экосистемой
  • Отличная документация — примеры использования каждого метода с описанием
  • Методы, вдохновленные синтаксисом утилит TypeScript
  • Поддерживается вывод статического типа из объекта схемы! (Это потрясающе ️❤️‍🔥)
  • Проверка во время выполнения и во время компиляции

Примитивная проверка

Начнем с проверки примитивных значений. ZOD поддерживает все примитивы с различными дополнительными специфическими проверками:

const StringSchema = z.string().min(1, { message: "Too short" }).max(20, { message: "Too long" });

С помощью этой прямой линии мы проверяем, что входящий ввод является строкой правильной длины. Кроме того, мы можем предоставить собственное сообщение об ошибке, если проверка схемы не удалась.

ZOD позволяет проверять все примитивы, такие как строки, числа, массивы и объекты.

Вывод типа

Я упомянул, что ZOD поддерживает статический вывод типов и извлекает тип TypeScript из любой схемы.

const StringSchema = z
    .string()
    .min(1, { message: 'Too short' })
    .max(20, { message: 'Too long' }).nullable();
type StringType = z.infer<typeof StringSchema>; 
// type StringType = string | null

Мы также можем легко вывести более сложный тип:

const CarSchema = z.object({
    color: z.string().min(2),
    type: z.string(),
    sits: z.number().lte(5).positive(),
    haveAlarm: z.boolean()
});
type CarType = z.infer<typeof CarSchema>;
//  type CarType = {
//    color: string;
//    type: string;
//    sits: number;
//    haveAlarm: boolean;
//  }

Благодаря ZOD мы можем передать enum в нашу схему проверки и проверить нулевые значения:

enum COLOR {
    'RED',
    'BLUE',
    'GREEN',
}

const CarSchema = z.object({
	color: z.nativeEnum(COLOR),
    sits: z.number().lte(5).positive(),
    haveAlarm: z.boolean(),
    error: z.string().nullable(),
    sport: z.boolean().optional(),
});
type CarType = z.infer<typeof CarSchema>;
// type CarType = {
//  	sport?: boolean | undefined;
//  	color: COLOR;
//  	error: string | null;
//  	sits: number;
//  	haveAlarm: boolean;
// }

Если мы хотим проверить объект на наличие нераспознанных ключей, мы можем использовать этот метод, и если во входных данных есть какие-либо неизвестные ключи, ZOD выдаст ошибку.

const CarSchema = z
    .object({
        sits: z.number().lte(5).positive(),
        haveAlarm: z.boolean(),
        sport: z.boolean().optional(),
    })
    .strict();
CarSchema.parse({
    sits: -5,
    haveAlarm: true,
    sport: 'yes',
    additionalKey: 'ERROR',
});

Парс и SafeParse

Zod предоставляет несколько методов проверки схемы. Два наиболее распространенных из них, и давайте посмотрим на важную разницу между ними.

const CarSchema = z.object({
    sits: z.number().lte(5).positive(),
    haveAlarm: z.boolean(),
    sport: z.boolean().optional(),
});

CarSchema.parse({
    sits: -5,
    haveAlarm: true,
    sport: 'yes',
});

Когда мы вызываем метод разбора некорректных данных, ZOD выдает исключение со следующим сообщением:

Метод .safeParse также проверит данные, но не вызовет исключения и не остановит приложение. В этом случае мы можем сами обрабатывать ошибки и сообщения:

const result = CarSchema.safeParse({
    sits: -5,
    haveAlarm: true,
    sport: 'yes',
});
if (!result.success) {
   // handle error
} else {
   // handle success
}

Сообщение об ошибке будет иметь тот же формат, что и в методе .parse.

Обработка ошибок

Рассмотрим обработку ошибок. ZOD предоставляет отличный API для обработки ошибок и несколько полезных методов. Первый, который мы можем использовать, это .format().

const result = CarSchema.safeParse({
    sits: -5,
    haveAlarm: true,
    sport: 'yes',
});
if (!result.success) {
  // handle error then return
  result.error.format();
}

Когда мы вызываем этот метод для ошибки ZOD, мы получаем более удобный формат:

Другой метод форматирования — .flatten(). Возвращаемая ошибка будет иметь следующий формат:

Заключение

Благодаря ZOD мы можем эффективно проверять нужные нам данные. Мы можем проверять очень сложную структуру данных, а благодаря статическому выводу типов TypeScript мы можем уменьшить количество типов в нашей системе. Если вы хотите более внимательно сравнить ZOD и другие библиотеки проверки схемы, ознакомьтесь с их прекрасной документацией.

Zod предоставляет множество полезных методов для создания схем, методы проверки примитивных значений, гибкую обработку ошибок и документацию со всеми поясненными нюансами.

Спасибо за прочтение ♥️♥️

Если статья была вам полезна, оставьте комментарий или 👍

Первоначально опубликовано на https://www.fun4code.com 2 августа 2022 г.