💎

Zodでカンマ区切り文字列を配列に変換しバリデーションする

2023/05/15に公開約900字

クエリにある配列を parse したい場合にすぐに思いつかなかったので、メモとして残したいと思います。

preprocess を使って事前に配列に変換する

preprocess とは - 公式ドキュメント
preprocessは第 1 引数に事前に行う処理を渡すことができ、その結果を第 2 引数に渡すスキーマでバリデーションができる。

カンマ区切り文字列を配列に変換してからバリデーションする

例)引数に渡した配列のいずれかと一致する要素であるか確認するスキーマ

const testScheme = <T extends readonly [string, ...string[]]>(union: T) =>
  z.preprocess((v) => {
    if (!v || typeof v !== "string") return v;
    return v.split(",");
  }, z.enum(union).array());

const hoge = z.object({
  key: testScheme(["aaa", "bbb", "ccc"]),
});

const result = hoge.parse({
  key: "aaa,ccc",
});
// => { key: ["aaa", "ccc"] }

const result = hoge.parse({
  key: "aaa,ddd",
});
// => ZodError

余談

最初はtransform, refineなどを使って...と頭に浮かび実装したのですが、
そうするとバリデーションの処理をrefineで自前で書く必要があり、意図した型で値を取り出すのも難しくなり詰まってしまいました 😇
そんなときにpreprocessの存在を知り、目からウロコだったので簡易ではありますが記事を書くに至りました。

他にも良い方法があれば教えていただけると嬉しいです 🙏

Discussion

ログインするとコメントできます