<

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

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 にも残しておきました。

https://stackblitz.com/edit/nodemon-fkzaw5?file=index.js

zod の github にある path の説明は、appended to error path と書いています。

役立ったら、☕でサポートしてね!

シェアしよう

関連するタグ