ウェブサイト検索

javascript - Yupスキーマに基づいて有効でない配列要素をフィルタリングする


私は API から来るデータを検証および型付けするために yup を使用しています。次のバリデーターと型があります:

export const someSchema = object({
  id: number().required(),
  name: string().required(),
  someArray: array().of(string()),
  date: dateSchema,
}).from('date', 'startDate')

export const someListSchema = array().of(someSchema)

export type SomeType = InferType<typeof someSchema>;

そしてそれは見事に機能します。配列は完璧に検証され、型も期待通りに想定されます。

唯一の問題は、配列をどのように検証するかで、次の方法で行っています:

await someListSchema.validate(data)

そして、もし配列の要素のいずれかがバリデータの要件を満たさない場合、エラーが発生し、バリデーション全体が失敗します。無効な配列要素を取り除き、残りの配列を返したいと思います。無効な要素をフィルタリングして有効な要素を保持しながら、どのようにバリデーションを進めますか?

オプション { abortEarly: false } を使って試してみましたし、配列を繰り返し処理して各要素ごとにバリデーションを行う方法も試しましたが、うまくいきませんでした。期待する結果を得るにはどうすればよいでしょうか?

よろしく、バルトシュ。

回答 #1

配列をループして、オブジェクトを個別に検証することができます。こうすることで、オブジェクトが検証に通らなかった場合に何を起こすか、自分自身のロジックを定義することができます。

例えば、

export const someSchema = object({
  id: number().required(),
  name: string().required(),
  someArray: array().of(string()),
  date: dateSchema,
}).from('date', 'startDate');

const results = await Promise.allSettled(data.map((object) => someSchema.validate(object)));
const filteredResults = results.filter(({status}) => status === "fulfilled").map(({value}) => value);