@k8ordo/form

スキーマと入力欄の対応

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"と、チェックしたときに送るvalue
  • z.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ファイルずつの繰り返しの行になります
  • 配列の行の中の入力欄に、ルールを宣言すること
  • 入力のマスク。値を書き換えることはできますが、カーソル位置の管理はフォームとは別の問題として扱っていません
k8ordo

Baselineに入った機能を、制限なく使うReactのライブラリ群。

© 2026 k8o — MIT License

組版:Noto Sans JP / M PLUS 2