💎
Zodでカンマ区切り文字列を配列に変換しバリデーションする
クエリにある配列を 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