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

背景
- zod
- next-i18next
- zod-i18n-map
を用いて多言語化対応を実装している。
実装の最中、当然必須項目バリデーションを実装するわけだが、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());

2025/03/05
この形式で動作させるとz.object(...).refine(...)
の時にobject()
の条件が満たされていなかった時、refine()
が評価されない事象を確認しました。
このスクラップは2024/12/25にクローズされました