🐕
他のプロパティに依存するzodスキーマはsuperRefineを使え
で書いたような
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