バリデーションアプローチ
- 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); });