yup について
JavaScript や TypeScript で検証スキーマを作る開発者向けの Yup クイックリファレンスです。主なスキーマ型や検証オプション、フォームでの利用方法を扱います。
主な機能
- 01文字列・数値・日付・配列・オブジェクトのスキーマ
- 02同期・非同期の検証
- 03InferType による型推論
- 04未知のフィールドの除去と型変換
活用シーン
- 01ユーザーやフォームのデータ検証
- 02複数の検証エラーの収集
- 03スキーマからの TypeScript 型推論
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ claude-dev-suite/ claude-dev-suite --skill yupインストール後、Claude Code で/yupを入力して読み込まれたか確認します。
同梱ファイルadvanced.md
詳細
Yup - クイックリファレンス
完全なリファレンス:条件付きバリデーション(.when)、カスタムバリデーション(.test)、Formik/React Hook Form との統合、変換、ローカライズについては、advanced.md を参照してください。
詳細なドキュメント:包括的なドキュメントを確認するには、technology:
yupを指定してmcp__documentation__fetch_docsを使用してください。
セットアップ
npm install yup
基本的な使い方
import * as yup from 'yup';
const userSchema = yup.object({
name: yup.string().required().min(2).max(50),
email: yup.string().required().email(),
age: yup.number().required().min(18).max(120).integer(),
bio: yup.string().optional(),
});
// Type inference
type User = yup.InferType<typeof userSchema>;
// Validate
async function validateUser(data: unknown) {
try {
const user = await userSchema.validate(data, { abortEarly: false });
return { success: true, data: user };
} catch (error) {
if (error instanceof yup.ValidationError) {
return { success: false, errors: error.errors };
}
throw error;
}
}
スキーマの型
文字列
const stringSchema = yup
.string()
.required('Name is required')
.min(2, 'Too short')
.max(100, 'Too long')
.trim()
.email('Invalid email')
.url('Invalid URL')
.matches(/^[a-zA-Z]+$/, 'Only letters allowed')
.oneOf(['option1', 'option2'], 'Must be one of the options');
数値
const numberSchema = yup
.number()
.required()
.min(0)
.max(100)
.positive()
.integer()
.typeError('Must be a number');
日付
const dateSchema = yup
.date()
.required()
.min(new Date('2020-01-01'), 'Too old')
.max(new Date(), 'Cannot be in future');
配列
const arraySchema = yup
.array()
.of(yup.string().required())
.required()
.min(1, 'At least one item')
.max(10, 'Maximum 10 items')
.ensure(); // Transform null/undefined to []
オブジェクト
const objectSchema = yup.object({
name: yup.string().required(),
address: yup.object({
street: yup.string().required(),
city: yup.string().required(),
}),
}).noUnknown(true); // Strip unknown keys
// Partial object (all fields optional)
const partialSchema = objectSchema.partial();
バリデーションオプション
const result = await schema.validate(data, {
abortEarly: false, // Return all errors, not just first
stripUnknown: true, // Remove unknown keys
strict: false, // Allow type coercion
});
// Sync validation
schema.validateSync(data);
schema.isValidSync(data); // Returns boolean
比較:Yup と Zod
| 機能 | Yup | Zod |
|---|---|---|
| 型推論 | 良好 | 優秀 |
| バンドルサイズ | 約12KB | 約8KB |
| 非同期バリデーション | 組み込み | .parseAsync() |
| Formik | ネイティブ対応 | リゾルバー経由 |
| 条件付き | .when() | .refine() |
このスキルを使わない場合
- 新規プロジェクト - TypeScript との統合に優れた Zod を推奨します
- NestJS アプリケーション - デコレーターを使った
class-validatorを使用してください - フォーム以外のバリデーション - 一般的なバリデーションには Zod の API のほうが適しています
アンチパターン
| アンチパターン | 問題点 | 適切な方法 |
|---|---|---|
| コンポーネント内のスキーマ | レンダリングのたびに再作成される | モジュールレベルで定義する |
| abortEarly: false を忘れる | 最初のエラーしか表示されない | abortEarly: false を設定する |
| カスタムメッセージがない | 汎用的なエラーになる | 各項目にカスタムメッセージを追加する |
| InferType を使わない | 型を手動で定義することになる | yup.InferType を使用する |
すぐに使えるトラブルシューティング
| 問題 | 原因 | 解決策 |
|---|---|---|
| InferType で型エラーが発生する | インポートが不足している | 'yup' から型をインポートする |
| 非同期バリデーションが機能しない | validateSync を使用している | .validate()(非同期)を使用する |
| 「Value is required」が予期せず表示される | undefined と null の違い | .nullable() または .optional() を使用する |
| エラーメッセージが表示されない | abortEarly: true | abortEarly: false を設定する |
本番環境向けチェックリスト
- スキーマがモジュールレベルで定義されている
- InferType による型推論を使用している
- カスタムエラーメッセージを設定している
- フォームで abortEarly: false を設定している
- フォームライブラリ用のリゾルバーを使用している
- 多言語対応の場合はローカライズしている
リファレンスドキュメント
コメント
Markdown 対応