Closed2

必須をz.string().min(1)でやりたくない

hanetsukihanetsuki

背景

  • zod
  • next-i18next
  • zod-i18n-map

を用いて多言語化対応を実装している。

https://zenn.dev/aiji42/articles/171f26af4e5b5c

実装の最中、当然必須項目バリデーションを実装するわけだが、z.string().min(1)で実装するとデフォルトのエラーメッセージが「1文字以上文字列を入力してください。」となる。

これは、本来表示したい「必須項目です。」とは異なるものだ。
意味合いは近いが異なるものなのは間違いない。

z.string().min(1, "必須項目です。")も多言語化対応によりラフに使うことが難しい中、どういう実装をしようか...

というのがこのスクラップです。

結論:preprocess()を用いる

z.string()の処理に入る前に空文字をundefinedに置き換えてしまうことでz.string()がもともと持つrequiredのバリデーションが効くことになる。

z.preprocess((v) => {
  if (typeof v !== 'string') {
    return v;
  }
  return v.trim() || undefined;
}, z.string());

https://zod.dev/?id=preprocess

hanetsukihanetsuki

2025/03/05
この形式で動作させるとz.object(...).refine(...)の時にobject()の条件が満たされていなかった時、refine()が評価されない事象を確認しました。

このスクラップは2024/12/25にクローズされました