結論: refineを使う
refineとは
Zod を使用すると、改良を通じてカスタム検証ロジックを提供できます。(公式ドキュメントより)
これだけだとよくわからないが、refineはこの文の中にある、カスタム検証ロジックの実現に欠かせないメソッドということらしい。
メソッドの仕様
const freeText = z.string().refine(
(val) => val.length <= 255, //val -> freeTextの値そのもの/戻り値はboolean
{
message: "String can't be more than 255 characters",//message -> falseの際に指定するバリデーションメッセージ
}
);
今回の要件を満たすためには?
オブジェクトのバリデーションを定義してrefineメソッドを使用する。
const freeObejct = z.object({
value :z.number(),
age: z.number()
}).refine(({ value, age }) => {
if (age <= 18) {
return false
}
return value >= 0;
},
{ message: "1以上の値を入力してください。" },
)
まとめ
かなり簡単に実装できた。
公式ドキュメントは少し理解しづらいのでZennなどのテックブログでこの類の情報は得た方がいい