メインコンテンツへスキップ

Zodで初期値のないラジオボタンを作ると、サブミット時にエラーメッセージが `Expected string, received null` となる

·52 文字·1 分
Captain Emo
著者
Captain Emo
ドメイン知識の抽出、テスト作成、React/Nodeを得意としています。

zod で次のようなバリデーションを作成したとき、

z.string().min(1, { message: "オプションの有無を選択してください" });

フォームで初期値のないラジオボタンを置くと、

<input type="radio" id="extra_option_yes" name="extra_option" value="yes" />
<label htmlFor="extra_option_yes">あり</label>
<input type="radio" id="extra_option_no" name="extra_option" value="no" />
<label htmlFor="extra_option_no">なし</label>

サブミット時に表示されるエラーが「オプションの有無を選択してください」ではなく “Expected string, received null” となってしまう。

回避方法 1 #

optional()をつけて、エラーメッセージをinvalid_type_errorにする

z.string({
  invalid_type_error: "オプションの有無を選択してください",
}).optional();

回避策 2 #

FieldArray を使っていると回避策 1 が動かないことがある、その場合nullish()をつけてrefine()でエラーメッセージを設定する

z.string().nullish().refine((v) => !!v, { message: 'オプションの有無を選択してください' }),