概要
Zod は TypeScript ファーストのスキーマバリデーションライブラリです。 スキーマ定義から TypeScript の型を自動導出できるため、型定義とバリデーションロジックの二重管理が不要になります。
基本的な使い方
import { z } from "zod";
const userSchema = z.object({
name: z.string().min(1),
age: z.number().int().min(0),
email: z.string().email().optional(),
});
type User = z.infer<typeof userSchema>; // 型を自動導出
const result = userSchema.safeParse({ name: "Alice", age: 30 });
if (result.success) {
console.log(result.data); // User 型
} else {
console.error(result.error.issues);
}
transform と refine
const schema = z
.string()
.transform((v) => v.trim())
.refine((v) => v.length > 0, { message: "空文字は不可" });
React Hook Form との組み合わせ
@hookform/resolvers/zod を使うと、フォームバリデーションに Zod スキーマをそのまま利用できます。
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
const { register, handleSubmit } = useForm<User>({
resolver: zodResolver(userSchema),
});
注意点
z.infer<typeof schema>で型を導出し、別途type定義を書かないparseはエラー時に例外を throw する。safeParseを基本とする- ネストが深いスキーマは
.merge()や.extend()で分割管理する