スキーマと入力欄の対応
zodのスキーマが、どんな入力欄と属性になるかの一覧です。あわせて、空のときに送られる値と、ブラウザで確かめない検証、扱えないスキーマをまとめています。
このページの内容
入力欄の種類
スキーマの型ごとに、inputのtypeは次のようになります。
z.string():type="text"z.email()、z.url():type="email"、type="url"z.iso.date()、z.iso.time():type="date"、type="time"z.iso.datetime({ local: true }):type="datetime-local"z.coerce.number():type="number"z.boolean()、z.literal(true):type="checkbox"z.stringbool():type="checkbox"と、チェックしたときに送るvaluez.file():type="file"input: "password"のメタ情報を付けた文字列:type="password"z.enum([…]):typeなし。<select>に展開しますz.array(z.enum([…])):typeなし。選択肢ごとのチェックボックスにします- それ以外(
z.uuid()やz.coerce.date()など):type="text"
z.email()やz.iso.date()に.regex()などの検証を重ねても、入力欄の種類は変わりません。
制約と属性
スキーマの制約は、次の属性になります。
- 文字列の
.min()、.max():minLength、maxLength .regex():pattern。正規表現が1つだけで、フラグを持たない場合に限ります- 数値の
.min()、.max():min、max .multipleOf():その値のstep。.int()だけならstep="1"、どちらも無ければstep="any"- ファイルの
.mime():accept - 空のときに送る値をスキーマが拒むとき:
required
空のときに送られる値
requiredを付けるかどうかも、parseFormがスキーマに渡す値も、ここで決まります。
- テキストの入力欄:
"" - チェックの無い
z.boolean()のチェックボックス:false - 数値と
z.coerce.bigint()、ファイル、選択肢:何も送らない(undefined) - チェックの無い
z.stringbool()のチェックボックス:何も送らない(undefined) - チェックの無いチェックボックスの集まり:
[]
ブラウザで確かめない検証
次の検証はHTMLの属性で表せないので、droppedに載ります。どれもサーバーでは確かめます。
- スキーマ全体に付けた
.refine() - 小数の範囲の、境界を含まない指定(
.gt()、.lt()) - フラグ付きの正規表現と、1つの文字列に重ねた複数の正規表現
patternを無視する入力欄(type="date"など)に付けた正規表現- ファイルの
.mime()と、大きさの.min()、.max() - チェックボックスの集まりの
.min()。minCheckedでブラウザでも確かめられます .transform()やz.custom()の後ろにあって、中身を読めない制約
警告
落とし穴
1つの入力欄や入れ子のオブジェクト、配列の行に付けた.refine()は、まだdroppedに載りません。ブラウザでは何も知らせずに通し、サーバーでだけ確かめます。
エラーになるスキーマ
次のスキーマを渡すと、formFieldsとparseFormが理由を添えてエラーを投げます。
z.number()とz.bigint()、z.date()、z.literal(1):どの値も文字列で届くので、どんな入力も通りません。z.coerceを使いますz.record、タプル、nullableなオブジェクト、行の中の行:送信する名前が1つに決まりません.や[、]を含むキー:名前の区切りと区別できませんz.stringbool().default(true):チェックを外してもfalseを送れません
まだできないこと
- 1つの入力欄で複数のファイルを受け取ること。
z.array(z.file())は、1ファイルずつの繰り返しの行になります - 配列の行の中の入力欄に、ルールを宣言すること
- 入力のマスク。値を書き換えることはできますが、カーソル位置の管理はフォームとは別の問題として扱っていません