🙈
zodのrefineにあるpathにハマった
zodのrefineを使っていたのですが、pathの使い方を全く理解できておらず、小一時間ほどハマってしまったことがあったので、備忘録として残しておきます。
背景
zodを使って、バリデーションロジックを書いていました。
バリデーションで複数フィールドを参照する必要があったため、refineを使っていました。
path
サンプルコードを以下に示します。
import { z } from 'zod';
const schema = z.object({
a: z
.object({
first: z.string(),
})
.refine(({ first }) => first === 'first', {
path: ['b'],
}),
});
aというオブジェクトにrefineを定義しました。refineの第2引数のpathに ['b']
を定義しました。
schemaのテストをしてみます。
import test from 'tape';
test('invalid', (t) => {
// Act
const data = schema.safeParse({
a: {
first: 'BUG',
},
});
// Assert
t.deepEqual(data.error.issues[0].path, ['a', 'b']);
t.end();
});
エラー(issue)のpathは、['a', 'b']
になります。めちゃくちゃ当たり前なんですが、以上です。(笑)
stackblitzにも残しておきました。
zodのgithubにあるpathの説明は、appended to error path
と書いています。
Discussion