0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Zodバリデーションメモ

Posted at

Zodとは

JavaScriptおよびTypeScript用のスキーマバリデーションライブラリ
公式ドキュメント

今回のバリデーション対応の具体例

案件を作成時に、単価下限、単価上限、単価備考のどれか一つに値が入力されていたらOK、入力がなければNGの処理を記述

create.tsx
import { z } from 'zod'

const schema = z.object({
  minPrice: z.number().optional(),
  maxPrice: z.number().optional(),
  note: z.string().optional(),
}).refine((data) => {
  const { minPrice, maxPrice, note } = data;
  const hasMinPrice = typeof minPrice === 'number' && !Number.isNaN(minPrice);
  const hasMaxPrice = typeof maxPrice === 'number' && !Number.isNaN(maxPrice);
  const hasNote = typeof note === 'string' && note !== '';
  return hasMinPrice || hasMaxPrice || hasNote;
}, {
  message: '単価下限、単価上限、備考のうちどれか1つを入力してください。',
  path: ['hasNote'],
});

// 使用例
const validData = {
  minPrice: 100,
  maxPrice: 200,
  note: '',
};
schema.parse(validData); // OK

const invalidData = {
  minPrice: undefined,
  maxPrice: null,
  note: '',
};
schema.parse(invalidData); // throws error

refine

refineは、オブジェクトのプロパティに対してチェック関数を定義し、エラーメッセージを設定することができます。
こちらを使用して
今回は3つある入力項目のうちいずれの項目も入力されなかった場合のバリデーション処理を書きました。

Zodのrefineメソッドを使用して、入力値のバリデーションをカスタマイズしています。refineは、オブジェクトのプロパティに対してチェック関数を定義し、エラーメッセージを設定することができます。
チェック関数は、オブジェクトのプロパティを受け取り、trueまたはfalseを返します。
今回は、hasMinPrice、hasMaxPrice、hasNoteというフラグを使用して、少なくとも1つのプロパティが入力されていることを確認しています。

path

こちらに指定されたプロパティが存在しない時は、エラーがスローされない。
なのでパス書くの忘れずに!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?