TypeScript でアプリケーションを書いていると、同じデータ構造を 2 回定義している自分に気づく瞬間があります。1 つは interface や type による型定義、もう 1 つは「この値が本当に想定どおりか」を実行時に確かめるバリデーションコードです。片方だけ直して片方を直し忘れた結果、型は通るのに本番で落ちる、という事故は珍しくありません。
この二重管理を解消する手段として広く使われているのが、TypeScript ファーストのスキーマバリデーションライブラリ Zod です。ただ、選定の現場では話がそれほど単純になりません。「Zod は重い・遅いと聞いた」「フロントエンドなら Valibot のほうがいいのでは」「ArkType のほうが速いらしい」といった指摘が飛び交い、どの情報がいつ時点のものなのかが判別しづらいからです。
実際、Zod の評価はバージョン 4 で大きく変わっています。旧来の「バンドルが重い」「型チェックが遅い」という指摘の多くは、公式リリースノートで数値付きの改善が報告されている領域です。古い比較記事の結論をそのまま持ち込むと、判断を誤る可能性があります。
本記事では、公式ドキュメント・README・GitHub API から取得した公開情報のみを根拠に、以下の 3 点を短時間で判断できるよう整理します。実行環境での動作検証は行っておらず、記載内容はすべてドキュメントベースの調査に基づくものです。
- Zod がどういう仕組みで「型と検証の一本化」を実現しているか
- Zod 4 で何が変わり、旧来の弱点がどこまで解消されたか
- Valibot・ArkType・TypeBox・Yup と比べたときの選定基準
TypeScriptのバリデーションでZodが選ばれる理由
結論から述べると、TypeScript のバリデーションで Zod が選ばれる理由は次の 3 点に集約されます。
1 つ目は、スキーマ 1 つから型と検証の両方が得られる点です。 Zod では z.object({ ... }) のようにスキーマを書くと、そこから TypeScript の静的型を推論できます。型定義とバリデーションを別々に書く必要がなくなるため、先に述べた二重管理の問題が構造的に発生しません。リポジトリの説明文も "TypeScript-first schema validation with static type inference"(TypeScript ファーストの、静的型推論を伴うスキーマバリデーション)となっており、この一本化が設計の中心に置かれています。
2 つ目は、Zod 4 で性能・バンドルサイズの弱点が解消されている点です。 公式サイト(zod.dev)によれば、コアバンドルは gzip 圧縮後 2kb・外部依存ゼロで、JSON Schema 変換もビルトインで備えています。パース性能についても Zod 3 比の改善値が公式に公表されています(詳細はのちほど扱います)。「Zod は重い」という評価が Zod 3 時代のものであれば、判断材料としては既に古い可能性があります。
3 つ目は、エコシステムの広さが選定コストそのものを下げる点です。 tRPC や React Hook Form 系のフォームライブラリ、OpenAPI 生成、ORM 連携、モック生成まで、Zod スキーマを入力として受け取るツールが揃っています。周辺ツールを自前でつなぐ工数を考えると、ライブラリ単体の優劣だけで比較するのは片手落ちになります。
ただし、これで「常に Zod が最適」という結論にはなりません。そのスキーマがクライアントのバンドルに載るかどうかで、判断軸は変わります。サーバー内で完結する検証ならエコシステムの厚みが効きますが、ブラウザに配信するバンドルサイズが厳しく制約される場面では別の選択肢が現実味を帯びます。この分岐については、後述の比較セクションで具体的な条件に落とし込みます。
Zodとは|スキーマから型を導出する仕組み
Zod の README は、このライブラリの立ち位置を次のように説明しています。
"Zod is a TypeScript-first validation library. Define a schema and parse some data with it. You'll get back a strongly typed, validated result."
「スキーマを定義してデータをパースすると、強く型付けされた検証済みの結果が返る」という一文が、そのまま使い方の全体像になっています。ここでは API を網羅するのではなく、なぜ型と検証が二重管理にならないのかという原理に絞って見ていきます。
スキーマ定義とパース
まずスキーマを定義します。以下は README からの引用です。
import * as z from "zod";
const Player = z.object({
username: z.string(),
xp: z.number(),
});
(出典: github.com/colinhacks/zod)
このスキーマに対してデータをパースします。
Player.parse({ username: "billie", xp: 100 });
// => returns { username: "billie", xp: 100 }
(出典: github.com/colinhacks/zod)
parse は検証に成功すれば値をそのまま返し、失敗すれば例外を投げます。ポイントは、この Player という変数が「実行時に動くバリデータ」であると同時に「静的型の情報源」でもある点です。片方を変更すればもう片方も自動的に追随するため、定義のずれが原理的に発生しません。
例外を投げないsafeParseとエラー構造
API ハンドラやフォーム処理のように、失敗が想定内のイベントである場面では try/catch を書きたくないことがあります。Zod は例外を投げない safeParse を提供しています。
const result = Player.safeParse({ username: 42, xp: "100" });
if (!result.success) {
result.error; // ZodError instance
} else {
result.data; // { username: string; xp: number }
}
(出典: github.com/colinhacks/zod)
返り値が success フラグで分岐する判別可能ユニオンになっているため、if (!result.success) を通過した後は result.data が正しい型として扱えます。エラー時の中身は ZodError で、個々の問題は issues として構造化されています。
try {
Player.parse({ username: 42, xp: "100" });
} catch (err) {
if (err instanceof z.ZodError) {
err.issues;
/* [
{
expected: 'string',
code: 'invalid_type',
path: [ 'username' ],
message: 'Invalid input: expected string, received number'
},
...
] */
}
}
(出典: github.com/colinhacks/zod)
path にフィールドへの経路が入っているため、フォームの該当入力欄にエラーメッセージを紐づける処理が書きやすくなります。フォームライブラリ連携のアダプタが多数存在するのは、このエラー構造が扱いやすい形で公開されているためです。
なお、非同期の refinement や transform を含むスキーマでは .parseAsync() / .safeParseAsync() を使う必要があると README に明記されています。API の詳細は公式の API ドキュメントにまとまっています。
z.inferによる型推論とz.input・z.outputの使い分け
スキーマから静的型を取り出すには z.infer を使います。
// extract the inferred type
type Player = z.infer<typeof Player>;
// use it in your code
const player: Player = { username: "billie", xp: 100 };
(出典: github.com/colinhacks/zod)
ここで注意したいのが、.transform() を使って入力値を別の値に変換する場合です。入力前の型と出力後の型が食い違うため、Zod は両者を区別できるようにしています。
const mySchema = z.string().transform((val) => val.length);
type MySchemaIn = z.input<typeof mySchema>;
// => string
type MySchemaOut = z.output<typeof mySchema>; // equivalent to z.infer<typeof mySchema>
// number
(出典: github.com/colinhacks/zod)
z.infer は z.output と等価です。フォームの入力値の型が欲しいのか、変換後にアプリケーション内部で扱う型が欲しいのかで使い分けます。この区別を知らないまま z.infer だけを使うと、変換を挟んだ箇所で型が想定と違うという混乱が起きやすいため、採用時に押さえておきたいポイントです。
ここまでが Zod の基本構造です。「スキーマが単一の情報源になる」という設計を受け入れられるかどうかが、他ライブラリとの比較以前の第一の判断ポイントになります。
Zod 4で解消された弱点|性能・バンドル・JSON Schema
Zod の選定でしばしば問題になるのが、「遅い」「重い」という評価がどの時点のものか判別しづらい点です。Zod 4 のリリースノート(zod.dev/v4)には、Zod 3 との比較数値が公式に記載されています。以下の数値はすべて公式が自己申告している値であり、本記事で独自に計測したものではありません。
パース性能とコンパイル時間
公式リリースノートが示す Zod 3 比のパース性能は次のとおりです。
対象 | Zod 3 比 |
|---|---|
文字列パース | 14.71x faster |
配列パース | 7.43x faster |
オブジェクトパース | 6.5x faster |
(出典: Zod 4 リリースノート)
見落とされがちですが、実務でより体感差が出やすいのは tsc のコンパイル時間のほうです。公式は .extend() / .omit() を多用する複雑なスキーマで、型チェック時間が 4000ms から 400ms へ約 10 倍改善したと報告しています(出典: Zod 4 リリースノート)。スキーマが数百単位に増えるプロジェクトでは、エディタの補完待ちや CI の型チェック時間として日常的に効いてくる部分です。
バンドルサイズ
バンドルサイズについても、公式が最小構成での比較値を公開しています。
構成 | コアバンドル |
|---|---|
Zod 3(boolean 1 つの最小例) | 12.47kb |
Zod 4 | 5.36kb |
Zod Mini | 1.88kb |
(出典: Zod 4 リリースノート)
Zod Mini は Zod 3 比で 85%・6.6 倍の削減とされています。なお公式サイトのトップでは「コアバンドル gzip 2kb」と表現されており、計測条件(最小例か・gzip 圧縮の有無か)によって示される数値が異なります。ライブラリ間のサイズ比較を行う際は、条件が揃っているかを確認しないと意味のない比較になる点に注意してください。
z.toJSONSchema()とメタデータレジストリが実務にもたらすもの
Zod 4 ではファーストパーティの JSON Schema 変換 z.toJSONSchema() が追加されました。あわせて、スキーマに説明やサンプル値などのメタデータを紐づける z.registry() / z.globalRegistry も導入されています(出典: Zod 4 リリースノート)。
これは単なる機能追加以上の意味を持ちます。Zod スキーマを起点に OpenAPI 仕様や LLM の Structured Output 用スキーマを生成したい場合、従来はサードパーティ変換ライブラリに依存する必要がありました。変換が公式機能として提供されることで、依存の一つが減り、Zod のバージョンアップ時に変換ライブラリの追随を待つリスクも下がります。
このほか Zod 4 では、再帰型のネイティブサポート(型キャスト不要)、ファイル検証 z.file()、テンプレートリテラル型 z.templateLiteral()、z.int32() / z.float64() / z.stringbool() といった数値・真偽値フォーマットが追加されています(出典: Zod 4 リリースノート)。
一方で、Zod 3 からの移行には破壊的変更のコストがあります。主なものは次の 2 点です。
- エラーカスタマイズの再編。
message/invalid_type_error/errorMapが統一されたerrorパラメータに集約された - refinement がスキーマをラップする形から、スキーマ内部にネストする形へ変更された
(出典: Zod 4 リリースノート)
既存プロジェクトで Zod 3 を広く使っている場合、エラーメッセージのカスタマイズ箇所が多いほど移行工数が膨らみます。新規採用なら最初から Zod 4 で始められるため、この論点は発生しません。
z.compileによるホットパス最適化と、その制約
README には AOT(事前)コンパイルの仕組みとして z.compile が記載されています。
const CompiledPlayer = z.compile(Player);
CompiledPlayer.parse({ username: "billie", xp: 100 });
(出典: github.com/colinhacks/zod)
z.compile(schema) は、事前コンパイル済みのファストパスを持つスキーマのクローンを返します。無効な入力は通常のパーサーにフォールバックするため、エラー報告の内容は変わりません。README によれば 55 スキーマのベンチマークで中央値 2.4 倍、オブジェクトの配列や 20 キーのオブジェクトで約 9 倍、ネストしたオブジェクトで約 4.5 倍とされています。一方 z.string() 単体には効果がなく、README は「単一の typeof には削れるものがない」と説明しています。
採用判断の観点では、高速化の数値より制約のほうが重要です。公式ドキュメント(zod.dev/compile)および README に記載されている主な制約は次のとおりです。
- 実装に
new Functionを使用する。z.config({ jitless: true })を指定する環境(CSP が厳しい環境など)ではグローバルモードが自動的に無効化される - 非同期の refinement / transform を含むスキーマはコンパイルできない。既定ではエラーにならずスキーマをそのまま返し、
{ strict: true }指定時のみ例外を投げる - 無効な入力時に refinement / transform が 2 回実行されうる
- コンパイル済みスキーマから
.refine()/.extend()で派生させると未コンパイルのスキーマが返るため、最終形のスキーマをコンパイルする必要がある
つまり z.compile は「全体に効く魔法」ではなく、ホットパスに限定して適用し、CSP 制約や副作用の再実行を許容できる場合に使う最適化という位置づけです。デフォルトの性能で足りるなら、無理に導入する必要はありません。
zod/miniを選ぶ判断軸|バンドルサイズが効く場面
「Zod か Valibot か」という二択で議論されがちですが、Zod 側にはもう一つの選択肢があります。tree-shaking を前提とした関数 API バリアントの Zod Mini(zod/mini)です。
通常の Zod がメソッドチェーンで記述するのに対し、Zod Mini は関数を入れ子にして組み立てます。公式ドキュメントの対比例は次のとおりです。
// Regular Zod
const mySchema = z.string().optional().nullable();
// Zod Mini
const mySchema = z.nullable(z.optional(z.string()));
(出典: Zod Mini ドキュメント)
バリデーションルールの付与も、メソッドチェーンではなく .check() に関数を渡す形になります。
// Regular Zod
z.string().min(5).max(10).trim()
// Zod Mini
z.string().check(z.minLength(5), z.maxLength(10), z.trim());
(出典: Zod Mini ドキュメント)
メソッドチェーンはインスタンスにメソッドがぶら下がる構造のため、使っていないメソッドもバンドルから落としにくいという性質があります。関数 API はインポートした関数だけがバンドルに含まれるため、未使用コードを削減できます。公式が示すサイズ比較は次のとおりです。
検証内容 | Zod Mini | 通常の Zod | 削減率 |
|---|---|---|---|
boolean 検証 | 2.12kb(gzip) | 5.91kb | 64% |
オブジェクトスキーマ | 4.0kb | 13.1kb | 69% |
(出典: Zod Mini ドキュメント)
ここで重要なのは、公式自身が「特別な制約がなければ通常の Zod を推奨」している点です。ドキュメントには "in general you should probably use regular Zod unless you have uncommonly strict constraints around bundle size"(一般的には、バンドルサイズに関して異例なほど厳しい制約がない限り、通常の Zod を使うべきでしょう)と記載されています(出典: Zod Mini ドキュメント)。バックエンドで動くスキーマであれば数 kb の差は実務上ほぼ無視できるため、記述性を犠牲にする意味がありません。
判断軸としては次のように整理できます。
- そのスキーマがクライアントバンドルに載らない(API サーバー・バッチ・CLI 内で完結する)→ 通常の Zod
- クライアントバンドルに載るが、サイズ予算に余裕がある→ 通常の Zod。Zod 4 のコアは 5.36kb まで縮んでいる
- クライアントバンドルに載り、かつ kb 単位の予算管理をしている(広告タグ・組み込みウィジェット・パフォーマンス要件の厳しい LP など)→
zod/miniを検討する
この整理によって、「Zod か Valibot か」という二択に見えていた問題が、実は 「通常の Zod か、zod/mini か、Valibot か」の三択であることが見えてきます。Zod のエコシステムを捨てずにサイズ問題だけを解く経路が存在する、という点が選定上の重要な情報です。
Valibot・ArkTypeとの違い|4つの判断軸で比較
ここからが本題です。Zod と並んで候補に挙がる主要ライブラリとの差分を、判断に使える形で整理します。
主要バリデーションライブラリの比較表
以下は 2026 年 9 月時点で GitHub API から取得した実測値と、各リポジトリの説明・公式ドキュメントに基づく整理です。
ライブラリ | スター数 | 最終更新 | API スタイル | 主眼 | エコシステム |
|---|---|---|---|---|---|
43,931 | 2026-09-13 | メソッドチェーン( | 型推論・汎用性・エコシステム | 最大規模(tRPC・フォーム・OpenAPI 生成など) | |
9,001 | 2026-09-12 | 関数を pipe で合成するモジュラー API | バンドルサイズ最小化(tree-shaking 前提) | 拡大中 | |
7,859 | 2026-09-09 | 型構文に近い文字列 DSL | 型ネイティブな記述と実行速度 | 拡大中 | |
6,960 | 2026-09-10 | JSON Schema ビルダー | JSON Schema ファースト | JSON Schema 準拠ツール群と接続 | |
23,665 | 2026-09-11 | メソッドチェーン | JS 時代からのフォームバリデーション | 既存資産が厚い |
(スター数・最終更新は 2026 年 9 月時点の gh api /repos/{owner}/{name} 取得値。TypeBox のライセンスは GitHub API 上 NOASSERTION(SPDX 判定不能)のため、本記事ではライセンスを断定しません)
利用実績の規模感として、npm の週間ダウンロード数(2026 年 9 月 5 日〜11 日)は zod が 209,218,437、valibot が 13,994,812、arktype が 1,475,518 でした(出典: npm registry API)。桁が 1〜2 つ違うため、社内での知見の集まりやすさ・トラブル時の情報の見つけやすさには差が出ると考えられます。
なお、Valibot のリポジトリは fabian-hiller/valibot から open-circle/valibot へ移管されています。古い記事のリンクを辿る場合は現行の所有者表記に注意してください。
設計思想の違い
数値以上に選定を左右するのが、各ライブラリの「どこから書き始めるか」という設計思想の違いです。
Zod はスキーマ起点です。 z.object() でスキーマを組み立て、そこから z.infer で静的型を導出します。スキーマが単一の情報源になるため、API 境界やフォームのように「実行時の検証が必須な場所」に置くと効果が最大化されます。
Valibot はモジュラー関数起点です。 関数を pipe で合成してスキーマを作るため、使った機能だけがバンドルに含まれます。クライアントに配信するコードのサイズを最優先する設計で、公式は単純な検証で 1KB 未満というサイズを示していますが、これは条件付きの公表値であり、他ライブラリの数値と単純に横並びで比較できるものではありません。
ArkType は型起点です。 TypeScript の型構文に近い文字列から検証器と静的型を同時に導出します。Zod が「スキーマを書いて型を推論する」のに対し、ArkType は「型を書いて検証器を得る」という逆向きの発想です。TypeScript の型記述に慣れているほど学習コストが低い一方、文字列 DSL に依存するため IDE 体験やツール連携の前提が Zod とは異なります。
TypeBox は JSON Schema 起点です。 JSON Schema そのものを構築し、そこから静的型を解決します。JSON Schema を仕様の中心に据える組織(API 定義・設定ファイルのスキーマ管理など)では自然な選択になります。Zod は独自スキーマが起点で、JSON Schema へは z.toJSONSchema() で変換する方向です。出発点がどちらかで、ツールチェーンとの接続コストが変わります。
Yup は先行世代の汎用バリデータです。 JavaScript 時代からのフォームバリデーション資産が厚く、既存プロジェクトでの実績も多いものの、TypeScript の型推論が設計の中心思想に置かれている度合いは Zod ほどではありません。既存コードが Yup で動いていて型推論への不満がないなら、移行の優先度は高くありません。
判断軸の言語化
以上を踏まえると、選定の判断は 2 つの問いにほぼ集約できます。
問い 1: そのスキーマはクライアントバンドルに載るか。
載らない(サーバー・バッチ・CLI で完結する)なら、バンドルサイズは判断材料からほぼ外れます。この場合はエコシステムと型推論の完成度が支配的になり、Zod の優位が大きくなります。載る場合は、サイズ予算がどの程度厳しいかを確認します。数 kb の差が許容範囲なら Zod 4 のままで問題なく、kb 単位で管理しているなら zod/mini か Valibot が候補になります。
問い 2: 既存のエコシステム資産を捨てるコストはいくらか。
tRPC・OpenAPI ジェネレータ・フォームアダプタ・モック生成など、すでに Zod スキーマを前提としたツールを使っているなら、ライブラリ単体のサイズ差より周辺ツールの置き換えコストのほうが大きくなりがちです。逆に、まだ何も決まっていない新規プロジェクトで、かつクライアントサイドの検証が主用途なら、Valibot や ArkType を検討する余地は十分にあります。
この 2 問に答えた結果が「サーバー中心・エコシステム重視」なら Zod、「クライアント中心・サイズ最優先」なら zod/mini か Valibot、「型記述への近さと速度を重視」なら ArkType、「JSON Schema が仕様の中心」なら TypeBox というのが、公開情報から導ける現時点の整理です。
Standard Schemaとエコシステム|Zod採用で付いてくるもの
選定時に多くの人が気にするのが「いま選んで間違えたら詰むのか」という点です。この不安に対しては、Standard Schema という仕様の存在が判断材料になります。
Standard Schema は、TypeScript エコシステムで共有される機能の提供・利用方法を標準化するインターフェース群です。特筆すべきは、公式サイトが策定者として @colinhacks(Zod)・@fabianhiller(Valibot)・@ssalbdivad(ArkType)の 3 名を挙げている点、つまり競合関係にある 3 ライブラリの作者による共同策定である点です(出典: standardschema.dev)。公式サイトの表記はハンドル名のみですが、GitHub のプロフィール上ではそれぞれ Colin McDonnell 氏、Fabian Hiller 氏、David Blass 氏であることが確認できます(出典: github.com/colinhacks、github.com/fabian-hiller、github.com/ssalbdivad)。
この仕様が解決しようとしているのは、エコシステムの断片化です。従来、フォームライブラリや API フレームワークが複数のバリデーションライブラリに対応するには、ライブラリごとのアダプタを用意する必要がありました。Standard Schema に準拠していれば、ツール側は「ライブラリ固有のアダプタなし・追加依存なし」で単一の入力を受け取れます。仕様は @standard-schema/spec として npm / JSR で配布されており、検証用の StandardSchemaV1、JSON Schema 変換用の StandardJSONSchemaV1 などのインターフェースが定義されています。
実務上の含意は明快です。主要 3 ライブラリがいずれも Standard Schema を実装している以上、後から乗り換えるコストは以前より下がっています。 ライブラリ選定を「一度決めたら戻れない不可逆な決断」として過度に重く扱う必要はありません。もちろんスキーマ記述そのものは書き直しになりますが、周辺ツールとの接続部分が丸ごと作り直しになるリスクは軽減されています。
その上で、Zod を選んだ場合に付いてくるエコシステムの厚みを確認しておきます。公式のエコシステム一覧には、以下のようなカテゴリが整理されています。
カテゴリ | 代表的なもの |
|---|---|
API ライブラリ | tRPC、nestjs-zod、Express Zod API |
フォーム連携 | Superforms、conform、zod-validation-error |
Zod → 他形式 | prisma-zod-generator、zod-openapi |
他形式 → Zod | orval、Hey API、DRZL(Drizzle ORM 由来) |
モック生成 | zod-schema-faker、zocker |
(出典: Zod エコシステム)
ここで注目したいのは「他形式 → Zod」のカテゴリです。OpenAPI 定義や DB スキーマから Zod スキーマを生成するツールが揃っているため、既存の仕様資産がある環境でも、ゼロからスキーマを書き直さずに導入を始められる経路が用意されています。導入コストの見積もりにおいて、この点は見落とされやすい要素です。
メンテナンス状況とライセンス|採用前に見る健全性指標
OSS を業務で採用する際、機能や性能と同じくらい重要なのがメンテナンスの継続性です。2026 年 9 月時点で、Zod の GitHub リポジトリから GitHub API 経由で取得したメタデータは次のとおりです。
項目 | 値 |
|---|---|
スター数 | 43,931 |
フォーク数 | 2,187 |
主要言語 | TypeScript |
ライセンス | MIT |
最終 push | 2026-09-13 |
アーカイブ状態 | archived=false(アーカイブされていない) |
フォーク | fork=false(他リポジトリのフォークではない本家) |
公開状態 | public |
(出典: gh api /repos/colinhacks/zod、2026 年 9 月 14 日取得)
リポジトリはアーカイブされておらず、フォークでもない本家リポジトリであり、ライセンスは MIT が明示的に設定されています。商用利用・改変・再配布のいずれについても、MIT の条件下で扱えます。
リリース頻度も確認できます。2026 年 9 月 9 日から 13 日までの 5 日間に v4.6.0・v4.6.1・v4.6.2・v4.6.3・v4.6.4 の 5 バージョンがリリースされています(出典: gh api /repos/colinhacks/zod/releases)。パッチリリースが短い間隔で出ているのは、報告された問題への対応サイクルが回っていることを示す指標です。
これを一般化すると、OSS の採用前に確認すべき健全性指標は次の 4 点に整理できます。
- 最終 push の日付: 数ヶ月〜年単位で更新が止まっていないか
- リリース頻度: パッチが継続的に出ているか(バグ報告への応答サイクルの有無)
- ライセンス: 商用利用可能なライセンスが明示されているか。
nullや SPDX 判定不能(NOASSERTION)の場合は法務確認が必要 - archived / fork フラグ: アーカイブ済みなら新規採用は避ける。フォークなら本家との差分を確認する
対比として、同じバリデーション領域の io-ts は 6,813 スターを持つ一方、最終 push が 2024 年 12 月 10 日で、約 1 年 9 ヶ月の間更新が確認できません(2026 年 9 月時点)。スター数は過去の評価の蓄積であり、現在のメンテナンス状況を表す指標ではないという点が、この対比からわかります。新規採用時にスター数だけを見て判断すると、この差を見落とします。
なお、上で挙げた TypeBox のライセンスが GitHub API 上 NOASSERTION となっている件は、指標 3 の実例に当たります。SPDX で自動判定できないライセンス表記の場合、リポジトリ内の LICENSE ファイルを直接確認し、必要に応じて法務確認を行う手順が必要です。
Zodの採用判断チェックリスト
ここまでの判断軸を、そのまま検討に使える形にまとめます。
前提条件の確認(すべての選択肢に先立つ)
- TypeScript v5.5 以上を使用しているか
tsconfig.jsonで"strict": trueが有効になっているか
この 2 点は公式サイト(zod.dev)に記載された動作要件です。strict が無効な環境では型推論が期待どおりに機能しないため、まずここを満たせるかを確認します。
通常の Zod を選ぶケース
- スキーマがサーバー・バッチ・CLI 内で完結し、クライアントバンドルに載らない
- tRPC・OpenAPI 生成・ORM 連携・フォームアダプタなど、周辺ツールとの接続を重視する
- クライアントに載るが、コア 5.36kb 相当のサイズを許容できる
- チーム内での知見の集まりやすさ・トラブルシューティング情報の多さを重視する
zod/mini を選ぶケース
- スキーマがクライアントバンドルに載り、かつ kb 単位でサイズ予算を管理している
- Zod のエコシステム・型推論は維持したいが、サイズだけを削りたい
- メソッドチェーンから関数 API への記述スタイル変更をチームが受け入れられる
Valibot・ArkType・TypeBox を検討するケース
- Valibot: 新規のクライアント中心プロジェクトで、バンドルサイズが最優先の評価軸になっている
- ArkType: TypeScript の型構文に近い記述を好み、型定義とスキーマの記法を寄せたい
- TypeBox: JSON Schema が組織の仕様管理の中心にあり、そこから型を解決したい
追加で確認したい論点
- 既存プロジェクトで Zod 3 を使っている場合、エラーカスタマイズ箇所の移行工数を見積もったか(
errorパラメータへの統合・refinement のネスト化が破壊的変更) - CSP が厳しい実行環境で
z.compileのグローバルモードを前提にしていないか(jitless指定時に自動無効化される) - 選定を不可逆な決断と捉えていないか(主要 3 ライブラリが Standard Schema を実装しているため、乗り換えコストは以前より低い)
まとめ
本記事では、TypeScript ファーストのスキーマバリデーションライブラリ Zod について、公式ドキュメント・README・GitHub API の公開情報のみを根拠に、採用判断に必要な材料を整理しました。
Zod が選ばれる理由は、スキーマ 1 つから型と検証を導出できる設計、Zod 4 で解消された性能・バンドルサイズの弱点、そして tRPC やフォームライブラリ・OpenAPI 生成に至るエコシステムの厚みにあります。とりわけ、パース性能(文字列 14.71 倍など)・tsc のコンパイル時間(4000ms → 400ms)・バンドルサイズ(12.47kb → 5.36kb)の改善は公式リリースノートに数値で記載されており、Zod 3 時代の評価をそのまま流用すると判断を誤る領域です。
一方で、Zod が常に最適解というわけではありません。判断は「そのスキーマがクライアントバンドルに載るか」「既存のエコシステム資産を捨てるコストはいくらか」の 2 問にほぼ集約されます。サーバー中心でエコシステムを重視するなら Zod、クライアント中心でサイズが最優先なら zod/mini か Valibot、型記述への近さを重視するなら ArkType、JSON Schema が仕様の中心なら TypeBox という棲み分けになります。そして、主要 3 ライブラリが Standard Schema を共同策定・実装している以上、この選定は不可逆な決断ではありません。
2026 年 9 月時点のリポジトリは archived=false / fork=false の健全な状態にあり、ライセンスは MIT、最終 push は 2026 年 9 月 13 日、直近 5 日間で 5 バージョンのリリースが確認できます。メンテナンス継続性の観点では、採用可能な状態が維持されていると判断できます。
次のアクションとしては、公式サイト(zod.dev)で動作要件と基本 API を確認し、サイズ制約が論点になる場合は Zod Mini ドキュメント、周辺ツールとの接続可否を確認したい場合はエコシステム一覧を参照する経路があります。本記事の内容はすべてドキュメントベースの調査に基づくものであり、実際の採用判断にあたっては、自プロジェクトのバンドル予算・既存ツールチェーン・TypeScript バージョンと照合してください。
関連情報
TypeScript を用いた Web アプリケーション開発や、型安全な設計・技術選定のご相談を検討中の方は、お問い合わせフォーム からご相談ください。要件の整理段階からご相談いただけます。



