🙈

zodのrefineにあるpathにハマった

2023/01/07に公開

zodのrefineを使っていたのですが、pathの使い方を全く理解できておらず、小一時間ほどハマってしまったことがあったので、備忘録として残しておきます。

背景

zodを使って、バリデーションロジックを書いていました。
バリデーションで複数フィールドを参照する必要があったため、refineを使っていました。

https://github.com/colinhacks/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