Effect Schema が『データ検証の次世代』を提示する
Effect SchemaはEffect-TSエコシステムの中核ライブラリで、Zodの代替として急速に注目を集めています。データ検証だけでなく、TypeScript型⇔ JSON Schema⇔ 実行時表現の双方向変換、Effect統合(エラー・依存性・並行性)、Branded Type、パイプライン記法など、Zodを大きく超える機能を提供。複雑な業務ロジックを扱う大規模TSアプリで採用が進んでいます。
採用すべき5つのシグナル
- Zodの双方向変換(input⇔output型の違い)に詰まった
- OpenAPI/JSON Schema自動生成が必要
- Effect-TSを既に採用している
- Branded Type・Refined Typeで型安全をさらに引き上げたい
- カスタム型・カスタム変換が頻発する
Zod/Valibot/Effect Schema比較
Zod: 軽量・標準・エコシステム最大・シンプル。
Valibot: Tree-shakable・小型・高速。
Effect Schema: フル機能・Effect統合・双方向変換・学習コスト高。
使い分け: シンプルバリデーションはZod/Valibot・大規模・Effect統合はEffect Schema。
主要機能
- Schema定義:
Schema.Struct({ name: Schema.String, age: Schema.Number }) - 双方向変換: parse(input→domain)と encode(domain→serialized)が独立
- Branded Type:
Schema.String.pipe(Schema.brand('UserId'))で型を強化 - Refined Type:
Schema.Number.pipe(Schema.between(0, 100)) - JSON Schema生成:
JSONSchema.make(schema)で自動生成 - Equivalence/Arbitrary: 等価判定・テスト用ランダム値生成
実装パターン
(1) API入力検証: HTTPリクエスト→ Effect Schema→ ドメイン型
(2) DB Schema: Drizzle/Prisma型→ Effect Schema→ API出力
(3) Form検証: フォーム入力→ 段階的検証→ エラー収集
(4) 環境変数: Schema.String.pipe(Schema.fromHexString)でパース
(5) OpenAPI生成: SchemaからOpenAPI仕様自動生成
本番採用の判断基準
- Effect-TS採用: Effect-TS生態系を採用しているなら自然な選択
- 学習コスト: 関数型・パイプライン記法に慣れが必要
- パフォーマンス: 大規模Schema時のbundleサイズと検証速度
- 移行コスト: Zodからの段階移行は可能だがAPI変換に手間
- 本番実績: Effect-TS採用企業で本番採用例
実装で詰まる3つの落とし穴
- パイプライン記法: メソッドチェーンに慣れていると違和感
- エラー型: ParseErrorの構造が複雑・カスタムエラーへの変換
- 双方向変換: parse/encodeの片方だけでなく両方を意識する設計
30日学習プラン
- 1週目: Effect Schema基礎・Struct/Array/Union
- 2週目: Branded Type・Refined Type・カスタム変換
- 3週目: Effect統合・エラー処理・依存性
- 4週目: OpenAPI生成・本番アプリ統合
関連リンク
Effect-TSは Effect-TS深掘り、Zodは Zod実践、TypeScriptは TypeScript実践 を参照してください。Drizzle ORMは Drizzle ORM深掘り もどうぞ。