🔷

Zodとは

2024/07/18に公開

Zod

スキーマ検証ライブラリです。TypeScriptで型安全なデータバリデーションを行うために使用されます。
スキーマを定義することにより、データの検証を行うことができます。
https://github.com/colinhacks/zod

インストール

npm install zod

オブジェクト検証

import { z } from 'zod';

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

type User = z.infer<typeof userSchema>;

const result = userSchema.safeParse({
  name: 'Mike',
  age: 25,
  email: 'mike@example.com'
});

const userDataLog = (user: User) => {
  console.log('ユーザー名:', user.name);
  console.log('年齢:', user.age);
  console.log('メールアドレス:', user.email);
}

if (result.success) {
  console.log('データ:', result.data);
  userDataLog(result.data);
} else {
  console.log('エラー:', result.error);
}

z.infer

ZodスキーマからTypeScriptの型を導出するためのユーティリティ型(既存の型から新しい型を生成するためのテンプレート)です。

よって、type User = z.infer<typeof userSchema>という行は、Zodライブラリの型推論機能を使って、定義されたuserSchemaスキーマからTypeScriptの型を自動的に生成しています。

今回のz.infer<typeof userSchema>は、userSchemaに基づいて次のような型を自動生成しています。

type User = {
  name: string;
  age: number;
  email: string;
}

文字列検証

import { z } from 'zod';

const nameSchema = z.string();
const result = nameSchema.safeParse("山田");

if (result.success) {
  console.log('名前:', result.data);
} else {
  console.log('エラー:', result.error);
}

カスタムバリデーション

refine()

指定した条件を満たすかどうかをチェックする関数とエラーメッセージを引数に保つことができます。

import { z } from 'zod';

const evenNumberSchema = z.number().refine(value => value % 2 === 0, {
  message: "数値は偶数である必要があります。"
});

const result = evenNumberSchema.safeParse(3);
if (result.success) {
  console.log('数値:', result.data);
} else {
  console.log('エラー:', result.error);
}

superRefine()

refine()と異なり、エラーオブジェクトに直接アクセスして、複数のエラーを追加することができます。

import { z } from 'zod';

const thanTenSchema = z.number().superRefine((value, ctx) => {
  if (value > 10) {
    ctx.addIssue({
      code: 'custom',
      message: '数値は10未満である必要があります。'
    });
  }
});

const result = thanTenSchema.safeParse(10);
if (result.success) {
  console.log('数値:', result.data);
} else {
  console.log('エラー:', result.error);
}

ctx

エラーを管理するための引数

addIssue

エラーについて詳細を記述するために使用されます。このメソッドを使って、カスタムエラーメッセージやエラーコードを指定することができます。

エラーメッセージのカスタマイズ

const emailSchema = z.string().email({ message: "正しいメールアドレスを入力してください。" });

const result = emailSchema.safeParse("test");
if (result.success) {
  console.log('メール:', result.data);
} else {
  console.log('エラー:', result.error);
}

終わりに

何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉

Discussion