zod vs joi vs yup vs class-validator vs class-transformer-validator
"データバリデーションライブラリ" npm パッケージ比較
1 年
zodjoiyupclass-validatorclass-transformer-validator類似パッケージ:
データバリデーションライブラリとは?

データバリデーションライブラリは、アプリケーションに入力されるデータが特定のルールや制約に従っているかどうかを確認するためのツールです。これらのライブラリは、ユーザー入力、APIリクエスト、データベースエンティティなど、さまざまなソースからのデータを検証するのに役立ちます。バリデーションは、データの整合性を確保し、エラーを防ぎ、セキュリティを強化するために重要です。これらのライブラリは、バリデーションルールを定義し、データがそれらのルールに従っているかどうかをチェックする機能を提供します。これにより、アプリケーションは不正なデータを処理する前に検出し、適切なエラーメッセージを返すことができます。

npmのダウンロードトレンド
GitHub Starsランキング
統計詳細
パッケージ
ダウンロード数
Stars
サイズ
Issues
公開日時
ライセンス
zod30,261,55437,665699 kB7087日前MIT
joi11,214,81921,084531 kB1861年前BSD-3-Clause
yup7,210,21323,353260 kB2485ヶ月前MIT
class-validator4,185,60911,3655.13 MB3109日前MIT
class-transformer-validator40,537203-165年前MIT
機能比較: zod vs joi vs yup vs class-validator vs class-transformer-validator

バリデーションアプローチ

  • zod:

    zodは、型安全なスキーマベースのバリデーションを提供し、TypeScriptとの統合が強化されています。スキーマは宣言的に定義され、型推論が自動的に行われます。

  • joi:

    joiは、スキーマベースのバリデーションを提供し、オブジェクトの構造を定義するためのスキーマを作成します。これにより、ネストされたオブジェクトや配列のバリデーションが容易になります。

  • yup:

    yupもスキーマベースのバリデーションを提供し、特に非同期バリデーションや条件付きバリデーションに強みがあります。スキーマはチェーンメソッドを使用して簡単に構築できます。

  • class-validator:

    class-validatorもクラスベースのアプローチを採用しており、デコレーターを使用してクラスプロパティにバリデーションルールを定義します。ただし、データの変換機能は提供していません。

  • class-transformer-validator:

    class-transformer-validatorは、クラスベースのアプローチを採用しており、クラスプロパティにデコレーターを使用してバリデーションルールを定義します。これにより、オブジェクトのインスタンスが作成されるときに自動的にバリデーションが行われます。

型安全性

  • zod:

    zodは、型安全性を重視しており、スキーマ定義から自動的に型が推論されます。これにより、型安全なバリデーションが保証されます。

  • joi:

    joiは、スキーマに基づいて型を生成することができますが、型安全性はデフォルトでは提供されていません。型定義を手動で行う必要があります。

  • yup:

    yupは、スキーマに基づいて型を生成することができますが、型安全性はデフォルトでは提供されていません。型定義を手動で行う必要があります。

  • class-validator:

    class-validatorは、TypeScriptのデコレーターを使用しており、型安全なバリデーションを提供しますが、型推論はバリデーションルールに依存します。

  • class-transformer-validator:

    class-transformer-validatorは、TypeScriptのデコレーターを使用しており、型安全性を提供しますが、データの変換に関しては明示的な型推論はありません。

非同期バリデーション

  • zod:

    zodは、非同期バリデーションをサポートしており、Promiseを返すカスタムバリデーターを使用することができます。

  • joi:

    joiは、非同期バリデーションをネイティブでサポートしており、Promiseを返すバリデーションが可能です。

  • yup:

    yupは、非同期バリデーションをネイティブでサポートしており、Promiseを返すバリデーションが可能です。

  • class-validator:

    class-validatorは、非同期バリデーションをサポートしており、Promiseを返すカスタムバリデーターを使用することができます。

  • class-transformer-validator:

    class-transformer-validatorは、非同期バリデーションをサポートしていません。すべてのバリデーションは同期的に行われます。

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

  • zod:

    zodは、エラーメッセージのカスタマイズが可能ですが、デフォルトのメッセージはあまり詳細ではありません。

  • joi:

    joiは、エラーメッセージのカスタマイズが非常に柔軟で、スキーマごとにカスタムメッセージを設定することができます。

  • yup:

    yupは、エラーメッセージのカスタマイズが容易で、各バリデーションルールにカスタムメッセージを設定することができます。

  • class-validator:

    class-validatorは、エラーメッセージのカスタマイズが容易で、各デコレーターにカスタムメッセージを設定することができます。

  • class-transformer-validator:

    class-transformer-validatorは、エラーメッセージのカスタマイズが可能ですが、デフォルトのメッセージはあまり詳細ではありません。

コード例

  • zod:

    zodを使用したバリデーションの例

    import { z } from 'zod';
    
    const schema = z.object({
      name: z.string().nonempty('名前は必須です'),
      email: z.string().email('無効なメールアドレスです'),
    });
    
    try {
      schema.parse({ name: '', email: 'invalid-email' });
    } catch (e) {
      console.log(e.errors);
    }
    
  • joi:

    joiを使用したバリデーションの例

    import Joi from 'joi';
    
    const schema = Joi.object({
      name: Joi.string().required().messages({
        'any.required': '名前は必須です',
      }),
      email: Joi.string().email().required().messages({
        'string.email': '無効なメールアドレスです',
      }),
    });
    
    const { error } = schema.validate({ name: '', email: 'invalid-email' });
    if (error) {
      console.log(error.details);
    }
    
  • yup:

    yupを使用したバリデーションの例

    import * as yup from 'yup';
    
    const schema = yup.object().shape({
      name: yup.string().required('名前は必須です'),
      email: yup.string().email('無効なメールアドレスです').required(),
    });
    
    schema.validate({ name: '', email: 'invalid-email' }).catch(err => {
      console.log(err.errors);
    });
    
  • class-validator:

    class-validatorを使用したバリデーションの例

    import { validate } from 'class-validator';
    import { IsEmail, IsNotEmpty } from 'class-validator';
    
    class User {
      @IsNotEmpty({ message: '名前は必須です' })
      name: string;
    
      @IsEmail({}, { message: '無効なメールアドレスです' })
      email: string;
    }
    
    const user = new User();
    user.name = '';
    user.email = 'invalid-email';
    
    validate(user).then(errors => {
      console.log(errors);
    });
    
  • class-transformer-validator:

    class-transformer-validatorを使用したバリデーションの例

    import { validate } from 'class-validator';
    import { plainToClass } from 'class-transformer';
    import { IsEmail, IsNotEmpty } from 'class-validator';
    import { validate } from 'class-validator';
    
    class User {
      @IsNotEmpty({ message: '名前は必須です' })
      name: string;
    
      @IsEmail({}, { message: '無効なメールアドレスです' })
      email: string;
    }
    
    const user = plainToClass(User, { name: '', email: 'invalid-email' });
    validate(user).then(errors => {
      console.log(errors);
    });
    
選び方: zod vs joi vs yup vs class-validator vs class-transformer-validator
  • zod:

    zodを選択するのは、型安全性を重視し、TypeScriptとの統合が強化されたバリデーションライブラリが必要な場合です。Zodは、スキーマ定義が型推論されるため、開発中のエラーを早期に検出できます。

  • joi:

    joiを選択するのは、スキーマベースのバリデーションが必要で、複雑なネストや条件付きバリデーションをサポートしたい場合です。Joiは、柔軟で強力なAPIを提供し、動的にスキーマを構築できます。

  • yup:

    yupを選択するのは、ReactやFormikなどのフロントエンドライブラリと統合しやすいバリデーションスキーマが必要な場合です。Yupは、Promiseベースの非同期バリデーションをサポートしており、使いやすいAPIを提供します。

  • class-validator:

    class-validatorを選択するのは、クラスベースのバリデーションを行いたいが、データの変換は必要ない場合です。このライブラリは、デコレーターを使用してクラスプロパティにバリデーションルールを定義し、バリデーションエラーを簡単に取得できます。

  • class-transformer-validator:

    class-transformer-validatorを選択するのは、クラスベースのデータ構造を使用しており、バリデーションと変換を同時に行いたい場合です。このライブラリは、TypeScriptのデコレーターを活用して、クラスプロパティにバリデーションルールを簡単に追加できます。