スキーマの定義
データを検証するには、まず スキーマ を定義する必要があります。スキーマは、単純なプリミティブ値から複雑なネストされたオブジェクトや配列まで、 型 を表します。
プリミティブ (Primitives)
Coercion (強制型変換)
入力データを適切な型に強制変換するには、代わりに z.coerce を使用します:
これらのスキーマの強制変換バリアントは、入力値を適切な型に変換しようとします。
これらの強制変換スキーマの入力型はデフォルトで unknown です。より具体的な入力型を指定するには、ジェネリックパラメータを渡します:
リテラル (Literals)
リテラルスキーマは、 "hello world" や 5 のような リテラル型 を表します。
JavaScriptのリテラル null と undefined を表すには:
複数のリテラル値を許可するには:
リテラルスキーマから許可された値のセットを抽出するには:
文字列 (Strings)
Zodは、組み込みの文字列検証および変換APIをいくつか提供しています。一般的な文字列検証を実行するには:
単純な文字列変換を実行するには:
文字列フォーマット (String formats)
一般的な文字列フォーマットに対して検証するには:
メールアドレス (Emails)
メールアドレスを検証するには:
デフォルトでは、Zodは一般的な文字を含む通常のメールアドレスを検証するように設計された、比較的厳密なメール正規表現を使用します。これはGmailによって強制されるルールと概ね同等です。この正規表現の詳細については、 この投稿 を参照してください。
メール検証の動作をカスタマイズするには、 pattern パラメータにカスタム正規表現を渡すことができます。
Zodは、使用できるいくつかの便利な正規表現をエクスポートしています。
UUID
UUIDを検証するには:
特定のUUIDバージョンを指定するには:
RFC 9562/4122 UUID仕様では、バイト8の最初の2ビットが 10 であることが要求されます。他のUUID風の識別子はこの制約を強制しません。任意のUUID風の識別子を検証するには:
URL
WHATWG互換のURLを検証するには:
ご覧のとおり、これは非常に寛容です。内部的には new URL() コンストラクタを使用して入力を検証します。この動作はプラットフォームやランタイムによって異なる場合がありますが、特定のJSランタイム/エンジンでURI/URLを検証する最も厳密な方法です。
ホスト名を特定の正規表現に対して検証するには:
プロトコルを特定の正規表現に対して検証するには、 protocol パラメータを使用します。
Web URL — 多くの場合、Web URLを具体的に検証したいでしょう。推奨されるスキーマは次のとおりです:
このプロトコルを http/https に制限し、ホスト名が z.regexes.domain 正規表現を使用した有効なドメイン名であることを確認します:
URLを正規化するには、 normalize フラグを使用します。これにより、入力値が new URL() によって返される 正規化されたURL で上書きされます。
ISO 日時 (ISO datetimes)
お気づきかもしれませんが、Zodの文字列にはいくつか日付/時刻関連のバリデーションが含まれています。これらのバリデーションは正規表現に基づいているため、完全な日付/時刻ライブラリほど厳密ではありません。しかし、ユーザー入力を検証するには非常に便利です。
z.iso.datetime() メソッドは ISO 8601 を強制します。デフォルトでは、タイムゾーンオフセットは許可されません:
タイムゾーンオフセットを許可するには:
修飾されていない(タイムゾーンなしの)日時を許可するには:
許容される時間の precision(精度)を制限するには。デフォルトでは、秒は省略可能で、任意のサブ秒精度が許可されます。
ISO 日付 (ISO dates)
z.iso.date() メソッドは、 YYYY-MM-DD 形式の文字列を検証します。
ISO 時刻 (ISO times)
z.iso.time() メソッドは、 HH:MM[:SS[.s+]] 形式の文字列を検証します。デフォルトでは、秒は省略可能であり、サブ秒の小数も同様です。
いかなる種類のオフセットも許可されません。
precision パラメータを使用して、許容される小数精度を制限します。
IPアドレス (IP addresses)
IPブロック (CIDR) (IP blocks (CIDR))
CIDR表記 で指定されたIPアドレス範囲を検証します。
MACアドレス (MAC Addresses)
標準の48ビットMACアドレス IEEE 802 を検証します。
JWT (JWTs)
JSON Web Tokens を検証します。
ハッシュ (Hashes)
暗号化ハッシュ値を検証するには:
デフォルトでは、 z.hash() は慣習どおり16進数エンコーディングを期待します。 enc パラメータを使用して別のエンコーディングを指定できます:
カスタムフォーマット (Custom formats)
独自の文字列フォーマットを定義するには:
このスキーマは "invalid_format" の問題を生成します。これは、refinements や z.custom() によって生成される "custom" エラーよりも説明的です。
テンプレートリテラル (Template literals)
新機能 — [email protected] で導入されました。
テンプレートリテラルスキーマを定義するには:
z.templateLiteral API は、任意の数の文字列リテラル(例: "hello")とスキーマを処理できます。推論された型が string | number | bigint | boolean | null | undefined に割り当て可能なスキーマであれば、どれでも渡すことができます。
数値 (Numbers)
数値を検証するには z.number() を使用します。これは有限の数値を許可します。
Zodは、数値固有のバリデーションをいくつか実装しています:
(何らかの理由で) NaN を検証したい場合は、 z.nan() を使用します。
整数 (Integers)
整数を検証するには:
BigInt (BigInts)
BigIntを検証するには:
Zodには、BigInt固有のバリデーションがいくつか含まれています。
ブール値 (Booleans)
ブール値を検証するには:
日付 (Dates)
Date インスタンスを検証するには z.date() を使用します。
エラーメッセージをカスタマイズするには:
Zodは、日付固有のバリデーションをいくつか提供しています。
列挙型 (Enums)
許容される 文字列 値の固定セットに対して入力を検証するには z.enum を使用します。
注意 — 文字列配列を変数として宣言すると、Zodは各要素の正確な値を適切に推論できなくなります。
これを修正するには、常に配列を直接 z.enum() 関数に渡すか、 as const を使用してください。
Enumのようなオブジェクトリテラル({ [key: string]: string | number })もサポートされています。
外部で宣言されたTypeScriptのenumを渡すこともできます。
Zod 4 — これはZod 3の z.nativeEnum() APIを置き換えるものです。
TypeScriptの enum キーワードを使用することは 推奨されていません 。
.enum
スキーマの値をenumのようなオブジェクトとして抽出するには:
.exclude()
特定の値を除外した新しいenumスキーマを作成するには:
.extract()
特定の値を抽出した新しいenumスキーマを作成するには:
ブール文字列 (Stringbools)
💎 Zod 4の新機能
場合によっては(例:環境変数の解析)、特定の文字列の「ブール値のような」値をプレーンな boolean 値に解析することが有益です。これをサポートするために、Zod 4では z.stringbool() が導入されました。
truthy(真)とfalsy(偽)の値をカスタマイズするには:
デフォルトでは、スキーマは大文字と小文字を区別しません。すべての入力は truthy/falsy 値と比較される前に小文字に変換されます。大文字と小文字を区別するようにするには:
オプショナル (Optionals)
スキーマをオプショナルにする(つまり、 undefined 入力を許可する)には。
これは元のスキーマをラップする ZodOptional インスタンスを返します。内部スキーマを抽出するには:
ヌーラブル (Nullables)
スキーマをヌーラブルにする(つまり、 null 入力を許可する)には。
これは元のスキーマをラップする ZodNullable インスタンスを返します。内部スキーマを抽出するには:
Nullish
スキーマをnullishにする(オプショナルかつヌーラブル)には:
nullish の概念の詳細については、TypeScriptのマニュアルを参照してください。
Unknown
ZodはTypeScriptの型システムを1対1で反映することを目指しています。そのため、Zodは以下の特別な型を表すAPIを提供しています:
Never
値はバリデーションを通過しません。
オブジェクト (Objects)
オブジェクト型を定義するには:
デフォルトでは、すべてのプロパティが必須です。特定のプロパティをオプショナルにするには:
デフォルトでは、認識されないキーは解析結果から削除されます:
z.strictObject
未知のキーが見つかった場合にエラーをスローする*厳密な(strict)*スキーマを定義するには:
z.looseObject
未知のキーの通過を許可する*ルーズな(loose)*スキーマを定義するには:
.catchall()
認識されないキーを検証するために使用されるcatchallスキーマを定義するには:
.shape
内部スキーマにアクセスするには:
.keyof()
オブジェクトスキーマのキーから ZodEnum スキーマを作成するには:
.extend()
オブジェクトスキーマに追加フィールドを加えるには:
このAPIは既存のフィールドを上書きするために使用できます!この力には注意してください!2つのスキーマがキーを共有している場合、BがAを上書きします。
代替案: スプレッド構文 (spread syntax) — .extend() を完全に避けて、新しいオブジェクトスキーマをゼロから作成することもできます。これにより、結果のスキーマの厳密性レベルが視覚的に明らかになります。
これを使用して、複数のオブジェクトを一度にマージすることもできます。
このアプローチにはいくつかの利点があります:
- ライブラリ固有のAPIではなく、言語レベルの機能(スプレッド構文)を使用します
- 同じ構文がZodとZod Miniで機能します
tsc効率が良いです —.extend()メソッドは大きなスキーマではコストがかかる可能性があり、 TypeScriptの制限 により、呼び出しが連鎖すると二次関数的にコストが増加します- 必要に応じて、
z.strictObject()またはz.looseObject()を使用して、結果のスキーマの厳密性レベルを変更できます
.safeExtend()
.safeExtend() メソッドは .extend() と同様に機能しますが、割り当て不可能なスキーマで既存のプロパティを上書きすることはできません。つまり、 .safeExtend() の結果は、元のスキーマを(TypeScriptの意味で) extends する推論された型を持ちます。
refinements(改善)を含むスキーマを拡張するには .safeExtend() を使用してください。(通常の .extend() は、refinementsを持つスキーマで使用されるとエラーをスローします。)
.pick()
TypeScriptの組み込みユーティリティ型 Pick と Omit に触発され、Zodはオブジェクトスキーマから特定のキーを選択および除外するための専用APIを提供します。
この初期スキーマから始めます:
特定のキーを選択(pick)するには:
.omit()
特定のキーを除外(omit)するには:
.partial()
便利なように、Zodは一部またはすべてのプロパティをオプショナルにするための専用APIを提供しています。これは組み込みのTypeScriptユーティリティ型 Partial に触発されています。
すべてのフィールドをオプショナルにするには:
特定のプロパティをオプショナルにするには:
.required()
Zodは一部またはすべてのプロパティを必須にするAPIを提供しています。これはTypeScriptの Required ユーティリティ型に触発されています。
すべてのプロパティを必須にするには:
特定のプロパティを必須にするには:
再帰的オブジェクト (Recursive objects)
自己参照型を定義するには、キーに getter を使用します。これにより、JavaScriptは実行時に循環スキーマを解決できます。
再帰的スキーマはサポートされていますが、Zodに循環データを渡すと無限ループが発生します。
相互再帰型を表すこともできます:
すべてのオブジェクトAPI(.pick(), .omit(), .required(), .partial() など)は期待通りに機能します。
循環エラー (Circularity errors)
TypeScriptの制限により、再帰的な型推論は扱いにくく、特定のシナリオでしか機能しません。より複雑な型では、次のような再帰型エラーが発生する可能性があります:
このような場合、問題のあるgetterに型注釈を付けることでエラーを解決できます:
配列 (Arrays)
配列スキーマを定義するには:
配列の要素の内部スキーマにアクセスするには:
Zodは、配列固有のバリデーションをいくつか実装しています:
タプル (Tuples)
配列とは異なり、タプルは通常、各インデックスに対して異なるスキーマを指定する固定長の配列です。
可変長("rest")引数を追加するには:
ユニオン (Unions)
ユニオン型 (A | B) は論理的な "OR" を表します。Zodのユニオン・スキーマは、入力を各オプションに対して順番にチェックします。最初に正常に検証された値が返されます。
内部のオプション・スキーマを抽出するには:
判別可能なユニオン (Discriminated unions)
判別可能なユニオン は、a) すべてのオプションがオブジェクトスキーマであり、b) 特定のキー(「判別子」)を共有している、特別な種類のユニオンです。判別子キーの値に基づいて、TypeScriptは型シグネチャを期待通りに「絞り込む」ことができます。
通常の z.union() でこれを表現することもできます。しかし、通常のユニオンは ナイーブ です — 入力を各オプションに対して順番にチェックし、最初に通過したものを返します。これは大規模なユニオンでは遅くなる可能性があります。
そのため、Zodは 判別子キー を使用して解析をより効率的に行う z.discriminatedUnion() APIを提供しています。
各オプションは、判別プロパティ(上記の例では status)が特定のリテラル値または値のセットに対応する オブジェクトスキーマ でなければなりません。通常は z.enum(), z.literal(), z.null(), または z.undefined() です。
インターセクション (Intersections)
インターセクション型 (A & B) は論理的な "AND" を表します。
これは2つのオブジェクト型を交差させるのに便利です。
オブジェクトスキーマをマージする場合は、インターセクションよりも A.extend(B) を優先してください。 .extend() を使用すると新しいオブジェクトスキーマが得られますが、 z.intersection(A, B) は pick や omit などの一般的なオブジェクトメソッドを欠く ZodIntersection インスタンスを返します。
レコード (Records)
レコードスキーマは Record<string, string> のような型を検証するために使用されます。
キースキーマは string | number | symbol に割り当て可能な任意のZodスキーマにすることができます。
enumで定義されたキーを含むオブジェクトスキーマを作成するには:
Zod 4 — Zod 4では、 z.record() の最初の引数に z.enum を渡すと、Zodはすべてのenum値がキーとして入力に存在することを網羅的にチェックします。この動作はTypeScriptと一致しています:
Zod 3では、網羅性はェックされていませんでした。古い動作を再現するには、 z.partialRecord() を使用してください。
部分的なレコード型が必要な場合は、 z.partialRecord() を使用してください。これは、Zodが z.enum() および z.literal() キースキーマで通常実行する特別な網羅性チェックをスキップします。
マップ (Maps)
セット (Sets)
セットスキーマは、以下のユーティリティメソッドを使用してさらに制約することができます。
ファイル (Files)
File インスタンスを検証するには:
プロミス (Promises)
非推奨 — z.promise() はZod 4で非推奨になりました。 Promise スキーマの有効なユースケースはほとんどありません。値が Promise である可能性があると思われる場合は、Zodで解析する前に単純に await してください。
Instanceof
入力がクラスのインスタンスであることを確認するには z.instanceof を使用できます。これは、サードパーティライブラリからエクスポートされたクラスに対して入力を検証するのに便利です。
プロパティ (Property)
Zodスキーマに対してクラスインスタンスの特定のプロパティを検証するには:
z.property() APIは任意のデータ型で動作します(ただし、 z.instanceof() と組み合わせて使用する場合に最も便利です)。
洗練 (Refinements)
すべてのZodスキーマは、 refinements の配列を保持しています。Refinementは、ZodがネイティブAPIを提供していないカスタムバリデーションを実行する方法です。
.refine()
Refinementの関数は決してスローしてはなりません。代わりに、失敗を通知するためにfalsy値を返す必要があります。スローされたエラーはZodによってキャッチされません。
error
エラーメッセージをカスタマイズするには:
abort
デフォルトでは、チェックからの検証問題は 継続可能 (continuable) と見なされます。つまり、Zodは、そのうちの1つが検証エラーを引き起こしたとしても、 すべて のチェックを順番に実行します。これは通常、Zodができるだけ多くのエラーを一度に表面化できることを意味するため、望ましい動作です。
特定のrefinementを 継続不可能 (non-continuable) としてマークするには、 abort パラメータを使用します。チェックが失敗した場合、バリデーションは終了します。
path
エラーパスをカスタマイズするには、 path パラメータを使用します。これは通常、オブジェクトスキーマのコンテキストでのみ役立ちます。
これにより、関連する問題の path パラメータが設定されます:
非同期のrefinementを定義するには、 async 関数を渡すだけです:
非同期refinementを使用する場合は、データを解析するために .parseAsync メソッドを使用する必要があります!そうしないと、Zodはエラーをスローします。
when
Note — これはパワーユーザー向けの機能であり、refinement内部から捕捉されないエラーが発生する確率を高めるような方法で悪用される可能性があります。
デフォルトでは、すでに 継続不可能 (non-continuable) な問題が発生している場合、refinementは実行されません。Zodは、refinement関数に値を渡す前に、値の型シグネチャが正しいことを保証するように注意しています。
場合によっては、refinementを実行するタイミングを細かく制御したいことがあります。たとえば、この「パスワード確認」チェックを考えてみましょう:
anotherField のエラーは、パスワード確認チェックが anotherField に依存していなくても、チェックの実行を妨げます。refinementを実行するタイミングを制御するには、 when パラメータを使用します。
.superRefine()
通常の .refine APIは "custom" エラーコードを持つ単一の問題のみを生成しますが、 .superRefine() を使用すると、Zodの内部問題タイプのいずれかを使用して複数の問題を作成できます。
.check()
Note — .check() APIは .superRefine() よりも一般的により複雑な、低レベルのAPIです。パフォーマンスに敏感なコードパスでは高速になる可能性がありますが、記述が冗長になります。
コーデック (Codecs)
New — Zod 4.1で導入されました。詳細については、専用の Codecs ページを参照してください。
コーデックは、2つの他のスキーマ間の 双方向変換 を実装する特別な種類のスキーマです。
通常の .parse() 操作は 順方向変換 を実行します。これはコーデックの decode 関数を呼び出します。
代わりにトップレベルの z.decode() 関数を使用することもできます。 .parse() ( unknown 入力を受け入れる)とは異なり、 z.decode() は強く型付けされた入力(この例では string )を期待します。
逆方向変換 を実行するには、逆の z.encode() を使用します。
詳細については、専用の Codecs ページを参照してください。そのページには、プロジェクトにコピー&ペーストできる一般的に必要なコーデックの実装が含まれています:
stringToNumberstringToIntstringToBigIntnumberToBigIntisoDatetimeToDateepochSecondsToDateepochMillisToDatejsonCodecutf8ToBytesbytesToUtf8base64ToBytesbase64urlToByteshexToBytesstringToURLstringToHttpURLuriComponentstringToBoolean
パイプ (Pipes)
スキーマは「パイプ」として連鎖させることができます。パイプは主に Transforms と組み合わせて使用する場合に便利です。
トランスフォーム (Transforms)
Note — 双方向変換の場合は、 codecs を使用してください。
トランスフォームは、単方向変換を実行する特別な種類のスキーマです。入力を検証する代わりに、あらゆるものを受け入れ、データに対して何らかの変換を実行します。トランスフォームを定義するには:
トランスフォーム関数は決してスローしてはなりません。スローされたエラーはZodによってキャッチされません。
トランスフォーム内でバリデーションロジックを実行するには、 ctx を使用します。バリデーションの問題を報告するには、 ctx.issues に新しい問題をプッシュします( .check() APIと同様です)。
最も一般的には、トランスフォームは Pipes と組み合わせて使用されます。この組み合わせは、いくつかの初期バリデーションを実行し、その後、解析されたデータを別の形式に変換する場合に役立ちます。
.transform()
スキーマをトランスフォームにパイプするのは一般的なパターンであるため、Zodは便利な .transform() メソッドを提供しています。
トランスフォームは非同期にすることもできます:
非同期トランスフォームを使用する場合は、データを解析する際に .parseAsync または .safeParseAsync を使用する必要があります!そうしないと、Zodはエラーをスローします。
.preprocess()
トランスフォームを別のスキーマにパイプするのも一般的なパターンであるため、Zodは便利な z.preprocess() 関数を提供しています。
デフォルト (Defaults)
スキーマにデフォルト値を設定するには:
あるいは、デフォルト値を生成する必要があるたびに再実行される関数を渡すこともできます:
プリフォルト (Prefaults)
Zodでは、 デフォルト 値を設定すると、解析プロセスがショートサーキット(短絡)されます。入力が undefined の場合、デフォルト値が即座に返されます。そのため、デフォルト値はスキーマの 出力型 に割り当て可能でなければなりません。
場合によっては、 プリフォルト ("解析前デフォルト")値を定義すると便利です。入力が undefined の場合、代わりにプリフォルト値が解析されます。解析プロセスはショートサーキット されません 。そのため、プリフォルト値はスキーマの 入力型 に割り当て可能でなければなりません。
これは、変更を伴うrefinementを通して何らかの入力値を渡したい場合にも役立ちます。
キャッチ (Catch)
検証エラーが発生した場合に返されるフォールバック値を定義するには、 .catch() を使用します:
あるいは、キャッチ値を生成する必要があるたびに再実行される関数を渡すこともできます。
ブランド型 (Branded types)
TypeScriptの型システムは 構造的 (structural) です。つまり、構造的に等価な2つの型は同じものと見なされます。
TypeScript内部で 公称的型付け (nominal typing) をシミュレートすることが望ましい場合があります。これは ブランド型 (または "opaque types")で実現できます。
内部的には、これはスキーマの推論された型に "ブランド" を付加することで機能します。
このブランドがあるため、プレーンな(ブランド化されていない)データ構造は推論された型に割り当てることはできなくなります。ブランド化されたデータを取得するには、スキーマを使用してデータを解析する必要があります。
ブランド型は .parse の実行時の結果には影響しないことに注意してください。これは静的な構成要素にすぎません。
読み取り専用 (Readonly)
スキーマを読み取り専用としてマークするには:
新しいスキーマの推論された型は readonly としてマークされます。TypeScriptでは、これはオブジェクト、配列、タプル、 Set 、および Map にのみ影響することに注意してください:
入力は通常どおり解析され、結果は変更を防ぐために Object.freeze() で凍結されます。
JSON
JSONエンコード可能な値を検証するには:
これは、次のユニオン・スキーマを返す便利なAPIです:
関数 (Functions)
Zodは、Zodで検証された関数を定義するための z.function() ユーティリティを提供しています。これにより、バリデーションコードとビジネスロジックが混在するのを避けることができます。
関数スキーマには .implement() メソッドがあり、これに関数を渡すと、入力と出力を自動的に検証する新しい関数を返します。
入力が無効な場合、この関数は ZodError をスローします:
入力の検証のみに関心がある場合は、 output フィールドを省略できます。
非同期関数を作成するには、 .implementAsync() メソッドを使用します。
カスタム (Custom)
z.custom() を使用して、任意のTypeScript型のZodスキーマを作成できます。これは、テンプレート文字列リテラルなど、Zodが標準でサポートしていない型のスキーマを作成する場合に便利です。
バリデーション関数を提供しない場合、Zodはあらゆる値を許可します。これは危険な場合があります!
2番目の引数を渡すことで、エラーメッセージやその他のオプションをカスタマイズできます。このパラメータは .refine のparamsパラメータと同じように機能します。

