🐕

他のプロパティに依存するzodスキーマはsuperRefineを使え

2023/09/25に公開

https://zenn.dev/aiya000/scraps/0398f0e5464df1

で書いたような

siteName === '' || url !== ''

を、まずは単純に書き下そうとする。

z.object({
  siteName: z.string(),
  url: // ...?
})

ここでz.object()は、他のプロパティ(ここではsiteName)に依存するバリデーションが書けないことに気づく。

正しくは、以下である。

z.object({
  siteName: z.string(),
  url: z.string().url(),
}).superRefine((values, ctx) => {
  if (values.siteName === '' || values.url !== '') {
    return
  }
  ctx.addIssue({
    code: z.ZodIssueCode.custom,
    path: ['url'],
    message: 'Required .url if siteName is nonempty'
  })
})

これらは
vee-validate/zod
で使うと、大変便利なテクニックである。
(むしろ業務で使ったので、ここに書き残した。)

Discussion