zod
TypeScriptでスキーマを定義し、データの型とバリデーションを同時に行えるZodライブラリのエキスパートとして、API入力やフォーム、環境変数などのデータ検証を効率化し、型定義とバリデーションコードを別々に書く手間を省くSkill。
📜 元の英語説明(参考)
You are an expert in Zod, the TypeScript-first schema declaration and validation library. You help developers define schemas that validate data at runtime AND infer TypeScript types at compile time — eliminating the need to write types and validators separately. Used for API input validation, form validation, environment variables, config files, and any data boundary.
🇯🇵 日本人クリエイター向け解説
TypeScriptでスキーマを定義し、データの型とバリデーションを同時に行えるZodライブラリのエキスパートとして、API入力やフォーム、環境変数などのデータ検証を効率化し、型定義とバリデーションコードを別々に書く手間を省くSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o zod.zip https://jpskill.com/download/15593.zip && unzip -o zod.zip && rm zod.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15593.zip -OutFile "$d\zod.zip"; Expand-Archive "$d\zod.zip" -DestinationPath $d -Force; ri "$d\zod.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
zod.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
zodフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Zod — TypeScript-First スキーマ検証
あなたは、TypeScript-first のスキーマ宣言および検証ライブラリである Zod のエキスパートです。Zod を使用すると、ランタイム時にデータを検証し、コンパイル時に TypeScript の型を推論するスキーマを定義できます。これにより、型とバリデーターを別々に記述する必要がなくなります。API の入力検証、フォーム検証、環境変数、構成ファイル、およびあらゆるデータ境界に使用されます。
主要な機能
スキーマ定義
import { z } from "zod";
// Primitives
const nameSchema = z.string().min(1).max(100);
const ageSchema = z.number().int().positive().max(150);
const emailSchema = z.string().email();
// Objects
const userSchema = z.object({
name: z.string().min(1, "Name is required"),
email: z.string().email("Invalid email"),
age: z.number().int().min(18, "Must be 18+").optional(),
role: z.enum(["user", "admin", "moderator"]).default("user"),
tags: z.array(z.string()).max(10).default([]),
address: z.object({
street: z.string(),
city: z.string(),
country: z.string().length(2), // ISO country code
zip: z.string().regex(/^\d{5}(-\d{4})?$/),
}).optional(),
metadata: z.record(z.string(), z.unknown()).optional(),
});
// Infer TypeScript type from schema — single source of truth
type User = z.infer<typeof userSchema>;
// {
// name: string; email: string; age?: number;
// role: "user" | "admin" | "moderator"; tags: string[];
// address?: { street: string; city: string; country: string; zip: string };
// metadata?: Record<string, unknown>;
// }
// Parse (throws on invalid)
const user = userSchema.parse(requestBody);
// Safe parse (returns result object)
const result = userSchema.safeParse(requestBody);
if (result.success) {
console.log(result.data); // Typed as User
} else {
console.log(result.error.flatten()); // Structured error messages
}
高度なパターン
// Discriminated unions
const eventSchema = z.discriminatedUnion("type", [
z.object({ type: z.literal("click"), x: z.number(), y: z.number() }),
z.object({ type: z.literal("scroll"), offset: z.number() }),
z.object({ type: z.literal("keypress"), key: z.string(), modifiers: z.array(z.string()) }),
]);
// Transform (parse + transform in one step)
const dateStringSchema = z.string().transform((s) => new Date(s));
const csvSchema = z.string().transform((s) => s.split(",").map((v) => v.trim()));
// Refinement (custom validation)
const passwordSchema = z.string()
.min(8, "At least 8 characters")
.refine((p) => /[A-Z]/.test(p), "Must contain uppercase")
.refine((p) => /[0-9]/.test(p), "Must contain number")
.refine((p) => /[^A-Za-z0-9]/.test(p), "Must contain special character");
// Recursive types
const categorySchema: z.ZodType<Category> = z.object({
name: z.string(),
children: z.lazy(() => z.array(categorySchema)).default([]),
});
// Environment variables
const envSchema = z.object({
DATABASE_URL: z.string().url(),
API_KEY: z.string().min(1),
PORT: z.coerce.number().default(3000), // Coerces string "3000" to number
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
});
const env = envSchema.parse(process.env);
// Pipe (chain transformations)
const numberFromString = z.string().pipe(z.coerce.number().positive());
API 検証
// Express middleware
import { z } from "zod";
function validate<T extends z.ZodType>(schema: T) {
return (req: Request, res: Response, next: NextFunction) => {
const result = schema.safeParse(req.body);
if (!result.success) {
return res.status(400).json({ errors: result.error.flatten().fieldErrors });
}
req.body = result.data;
next();
};
}
app.post("/api/users", validate(userSchema), (req, res) => {
// req.body is validated and typed
});
インストール
npm install zod
ベストプラクティス
- Single source of truth — スキーマを一度定義し、
z.infer<>で型を推論します。型定義を複製しないでください。 - safeParse over parse — API では
safeParseを使用します。例外をスローする代わりにエラーオブジェクトを返します。 - Coerce for strings — クエリパラメータと環境変数には
z.coerce.number()を使用します。文字列を自動的に変換します。 - Default values — デフォルト値を提供するには
.default()を使用します。スキーマはトランスフォーマーでもあります。 - Error messages — カスタムメッセージを渡します:
z.string().min(1, "Required")。ユーザーフレンドリーな検証です。 - Discriminated unions — API イベントタイプ、ポリモーフィックデータに使用します。TypeScript は正しく絞り込みます。
- Environment validation — 起動時に
process.envを検証します。構成がない場合はすぐに失敗します。 - Composability — スキーマの再利用には、
.extend()、.pick()、.omit()、.merge()を使用します。DRY スキーマ。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Zod — TypeScript-First Schema Validation
You are an expert in Zod, the TypeScript-first schema declaration and validation library. You help developers define schemas that validate data at runtime AND infer TypeScript types at compile time — eliminating the need to write types and validators separately. Used for API input validation, form validation, environment variables, config files, and any data boundary.
Core Capabilities
Schema Definition
import { z } from "zod";
// Primitives
const nameSchema = z.string().min(1).max(100);
const ageSchema = z.number().int().positive().max(150);
const emailSchema = z.string().email();
// Objects
const userSchema = z.object({
name: z.string().min(1, "Name is required"),
email: z.string().email("Invalid email"),
age: z.number().int().min(18, "Must be 18+").optional(),
role: z.enum(["user", "admin", "moderator"]).default("user"),
tags: z.array(z.string()).max(10).default([]),
address: z.object({
street: z.string(),
city: z.string(),
country: z.string().length(2), // ISO country code
zip: z.string().regex(/^\d{5}(-\d{4})?$/),
}).optional(),
metadata: z.record(z.string(), z.unknown()).optional(),
});
// Infer TypeScript type from schema — single source of truth
type User = z.infer<typeof userSchema>;
// {
// name: string; email: string; age?: number;
// role: "user" | "admin" | "moderator"; tags: string[];
// address?: { street: string; city: string; country: string; zip: string };
// metadata?: Record<string, unknown>;
// }
// Parse (throws on invalid)
const user = userSchema.parse(requestBody);
// Safe parse (returns result object)
const result = userSchema.safeParse(requestBody);
if (result.success) {
console.log(result.data); // Typed as User
} else {
console.log(result.error.flatten()); // Structured error messages
}
Advanced Patterns
// Discriminated unions
const eventSchema = z.discriminatedUnion("type", [
z.object({ type: z.literal("click"), x: z.number(), y: z.number() }),
z.object({ type: z.literal("scroll"), offset: z.number() }),
z.object({ type: z.literal("keypress"), key: z.string(), modifiers: z.array(z.string()) }),
]);
// Transform (parse + transform in one step)
const dateStringSchema = z.string().transform((s) => new Date(s));
const csvSchema = z.string().transform((s) => s.split(",").map((v) => v.trim()));
// Refinement (custom validation)
const passwordSchema = z.string()
.min(8, "At least 8 characters")
.refine((p) => /[A-Z]/.test(p), "Must contain uppercase")
.refine((p) => /[0-9]/.test(p), "Must contain number")
.refine((p) => /[^A-Za-z0-9]/.test(p), "Must contain special character");
// Recursive types
const categorySchema: z.ZodType<Category> = z.object({
name: z.string(),
children: z.lazy(() => z.array(categorySchema)).default([]),
});
// Environment variables
const envSchema = z.object({
DATABASE_URL: z.string().url(),
API_KEY: z.string().min(1),
PORT: z.coerce.number().default(3000), // Coerces string "3000" to number
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
});
const env = envSchema.parse(process.env);
// Pipe (chain transformations)
const numberFromString = z.string().pipe(z.coerce.number().positive());
API Validation
// Express middleware
import { z } from "zod";
function validate<T extends z.ZodType>(schema: T) {
return (req: Request, res: Response, next: NextFunction) => {
const result = schema.safeParse(req.body);
if (!result.success) {
return res.status(400).json({ errors: result.error.flatten().fieldErrors });
}
req.body = result.data;
next();
};
}
app.post("/api/users", validate(userSchema), (req, res) => {
// req.body is validated and typed
});
Installation
npm install zod
Best Practices
- Single source of truth — Define schema once; infer types with
z.infer<>; never duplicate type definitions - safeParse over parse — Use
safeParsein APIs; returns error object instead of throwing - Coerce for strings — Use
z.coerce.number()for query params and env vars; auto-converts strings - Default values — Use
.default()to provide defaults; schema is also a transformer - Error messages — Pass custom messages:
z.string().min(1, "Required"); user-friendly validation - Discriminated unions — Use for API event types, polymorphic data; TypeScript narrows correctly
- Environment validation — Validate
process.envat startup; fail fast on missing config - Composability —
.extend(),.pick(),.omit(),.merge()for schema reuse; DRY schemas