型安全性
- zod:
zod
は、TypeScriptファーストのライブラリで、スキーマから自動的に型を推論できます。型安全性が高く、型定義と検証が一貫しています。 - joi:
joi
は、型安全性を提供しますが、TypeScriptとの統合はio-ts
ほど強力ではありません。スキーマ定義は柔軟ですが、型情報は手動で管理する必要があります。 - yup:
yup
は、型安全性を提供しますが、TypeScriptとの統合は限定的です。スキーマ定義は柔軟ですが、型情報は自動的には生成されません。 - superstruct:
superstruct
は、型安全性を提供しますが、TypeScriptとの統合は他のライブラリほど強力ではありません。型定義は明示的ですが、ランタイムでの型検証は手動で行う必要があります。 - io-ts:
io-ts
は、TypeScriptの型システムと密接に統合されており、型安全なランタイム検証を提供します。型定義と検証ロジックを一元管理できるため、型情報を活用した検証が可能です。 - runtypes:
runtypes
は、TypeScriptの型情報を活用したランタイム検証を提供します。型定義と検証が明確に分かれており、型安全性が高いです。
非同期検証
- zod:
zod
は非同期検証をサポートしており、Promiseを返すカスタム検証関数を簡単に組み込むことができます。 - joi:
joi
は非同期検証をネイティブでサポートしており、Promiseを返すカスタム検証が容易です。 - yup:
yup
は非同期検証をネイティブでサポートしており、Promiseを返すカスタム検証が容易です。 - superstruct:
superstruct
は非同期検証をサポートしており、Promiseを返すカスタム検証関数を簡単に組み込むことができます。 - io-ts:
io-ts
は非同期検証をサポートしていませんが、Promiseを返すカスタム検証関数を使用することは可能です。 - runtypes:
runtypes
は非同期検証をサポートしていませんが、Promiseを返すカスタム検証関数を使用することは可能です。
カスタム検証
- zod:
zod
はカスタム検証をサポートしており、カスタム検証関数を簡単にスキーマに組み込むことができます。 - joi:
joi
はカスタム検証を非常に強力にサポートしており、簡単にカスタム検証関数を作成してスキーマに組み込むことができます。 - yup:
yup
はカスタム検証をサポートしており、カスタムバリデーション関数をスキーマに追加することが容易です。 - superstruct:
superstruct
はカスタム検証をサポートしており、カスタム検証関数を簡単に組み込むことができます。 - io-ts:
io-ts
はカスタム検証をサポートしていますが、実装には少し手間がかかります。カスタムタイプを定義することで、独自の検証ロジックを組み込むことができます。 - runtypes:
runtypes
はカスタム検証をサポートしていますが、カスタム検証関数を手動で定義する必要があります。
エラーメッセージのカスタマイズ
- zod:
zod
はエラーメッセージのカスタマイズが可能で、各検証ルールに対してカスタムメッセージを設定することができます。 - joi:
joi
はエラーメッセージのカスタマイズが非常に柔軟で、各検証ルールごとにカスタムメッセージを設定することができます。 - yup:
yup
はエラーメッセージのカスタマイズが容易で、各フィールドや検証ルールに対してカスタムメッセージを設定することができます。 - superstruct:
superstruct
はエラーメッセージのカスタマイズが可能ですが、デフォルトのメッセージを上書きする必要があります。 - io-ts:
io-ts
はエラーメッセージのカスタマイズが難しいですが、カスタムエラーメッセージを返すようにカスタムタイプを設定することができます。 - runtypes:
runtypes
はエラーメッセージのカスタマイズが限られていますが、カスタムエラーメッセージを返すようにカスタム検証関数を設定することができます。
Ease of Use: Code Examples
- zod:
zod
のカスタム検証の例import { z } from 'zod'; // カスタム検証関数 const isPositive = (value: number) => { if (value <= 0) throw new Error('値は正の数でなければなりません。'); return value; }; // スキーマの定義 const schema = z.object({ age: z.number().refine(isPositive, { message: '値は正の数でなければなりません。' }), }); // 検証 schema.parse({ age: -5 });
- joi:
joi
のカスタム検証の例const Joi = require('joi'); // カスタム検証関数 const isPositive = (value, helpers) => { if (value > 0) return value; throw new Error('値は正の数でなければなりません。'); }; // スキーマの定義 const schema = Joi.object({ age: Joi.number().custom(isPositive, '正の数の検証'), }); // 検証 const { error, value } = schema.validate({ age: -5 }); if (error) { console.log('検証エラー:', error.message); } else { console.log('検証成功:', value); }
- yup:
yup
のカスタム検証の例const yup = require('yup'); // カスタム検証関数 const isPositive = (value) => { if (value <= 0) throw new yup.ValidationError('値は正の数でなければなりません。'); return value; }; // スキーマの定義 const schema = yup.object().shape({ age: yup.number().custom(isPositive), }); // 検証 schema.validate({ age: -5 }).catch((err) => { console.log('検証エラー:', err.message); });
- superstruct:
superstruct
のカスタム検証の例import { struct } from 'superstruct'; // カスタム検証関数 const isPositive = (value) => { if (value <= 0) throw new Error('値は正の数でなければなりません。'); return value; }; // ストラクチャの定義 const User = struct({ age: 'number', positiveAge: isPositive, }); // 検証 try { User({ age: 25, positiveAge: -5 }); } catch (error) { console.log('検証エラー:', error.message); }
- io-ts:
io-ts
のカスタム検証の例import * as t from 'io-ts'; import { isRight } from 'fp-ts/lib/Either'; // カスタム検証関数 const isPositive = (n: number) => n > 0; // カスタムタイプの定義 const PositiveNumber = new t.Type<number, number, unknown>( 'PositiveNumber', (u): u is number => typeof u === 'number' && isPositive(u), (u, c) => (isPositive(u) ? t.success(u) : t.failure(u, c)), t.identity ); // 検証 const result = PositiveNumber.decode(10); if (isRight(result)) { console.log('検証成功:', result.right); } else { console.log('検証失敗:', result.left); }
- runtypes:
runtypes
のカスタム検証の例import { Runtype, Number, Record } from 'runtypes'; // カスタム検証関数 const isPositive = (n: number) => n > 0; // カスタムタイプの定義 const PositiveNumber: Runtype<number> = Number.withConstraint(isPositive); // スキーマの定義 const User = Record({ age: PositiveNumber, }); // 検証 const result = User.validate({ age: 10 }); console.log(result);