スキーマの合成と改良
refine、transform、ユニオンを使って複雑なスキーマを構築します。
「スキーマの合成と改良」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
スキーマを組み合わせる
Zodのスキーマは、組み合わせて使える構成要素です。スキーマを改良、変換、拡張、結合することで、複雑な検証ルールをモデル化できます。
import { z } from "zod";
const base = z.object({ name: z.string() });
// We will add rules and combine schemas from here.refineでカスタムルールを追加する
.refineは、エラーメッセージ付きのカスタム検証述語を追加します。Zodに組み込みの機能がないルールに使えます。
import { z } from "zod";
const password = z.string().refine(
(s) => s.length >= 8,
{ message: "Must be at least 8 characters" }
);
// password.parse("short") throws with that message.複数のフィールドにまたがって検証する
オブジェクトに.refineを適用すると、フィールド間の関係を検証できます。たとえば、パスワードと確認用パスワードの一致を検証できます。
import { z } from "zod";
const form = z.object({
password: z.string(),
confirm: z.string()
}).refine((d) => d.password === d.confirm, {
message: "Passwords must match"
});
// Validates both fields together.値を変換する
.transformは、検証済みの値を別の形状に変換します。検証が成功した後に実行されます。
import { z } from "zod";
const trimmed = z.string().transform((s) => s.trim());
const result = trimmed.parse(" hi "); // "hi"オプショナルなフィールド
.optional()を付けると、フィールドがなくても許可されるようになります。このことは検証と推論された型の両方に反映されます。
import { z } from "zod";
const schema = z.object({
name: z.string(),
bio: z.string().optional()
});
// bio may be omitted.デフォルト値
.defaultは入力がない場合に値を補います。そのため、解析結果には常にそのフィールドが設定されます。
import { z } from "zod";
const schema = z.object({
retries: z.number().default(3)
});
const r = schema.parse({}); // { retries: 3 }ユニオンスキーマ
z.unionは、複数のスキーマのうちいずれか1つに一致する値を受け入れます。TypeScriptのユニオンに相当するZodの機能です。
import { z } from "zod";
const id = z.union([z.string(), z.number()]);
// id.parse("abc") and id.parse(123) both succeed.Zodの判別可能なユニオン
z.discriminatedUnionは、判別フィールドに基づいて切り替えることで、タグ付きユニオンを効率的に検証します。
import { z } from "zod";
const shape = z.discriminatedUnion("kind", [
z.object({ kind: z.literal("circle"), radius: z.number() }),
z.object({ kind: z.literal("square"), side: z.number() })
]);
// Picks the right member by kind.extendでマージする
.extendは既存のオブジェクトスキーマにフィールドを追加します。小さなスキーマから、より大きなスキーマを構築できます。
import { z } from "zod";
const base = z.object({ id: z.number() });
const user = base.extend({ name: z.string() });
// user validates { id: number; name: string }オブジェクトスキーマを結合する
.mergeを使って2つのオブジェクトスキーマを結合することもできます。すべてのフィールドが1つのスキーマにまとめられます。
import { z } from "zod";
const a = z.object({ x: z.number() });
const b = z.object({ y: z.string() });
const combined = a.merge(b);
// combined validates { x: number; y: string }すべてを連結する
改良、変換、デフォルト、拡張を流れるように連結することで、読みやすい1つのスキーマに豊富な検証ルールを表現できます。
import { z } from "zod";
const signup = z.object({
email: z.string().refine(s => s.includes("@"), { message: "Invalid email" }),
age: z.number().default(18)
}).extend({
newsletter: z.boolean().optional()
});
// One schema, many rules.確認問題:スキーマの合成
スキーマの合成と改良について理解度を確認します。
まとめ:スキーマの合成と改良
.refineでカスタムルールを追加し、.transformで値の形状を変え、.optionalと.defaultで欠損データを処理し、z.unionで選択肢を組み合わせ、.extendと.mergeでスキーマを拡張する方法を学びました。
import { z } from "zod";
const schema = z.object({ name: z.string() })
.extend({ age: z.number().default(0) })
.refine(d => d.name.length > 0, { message: "Name required" });
// Composed validation in one place.よくある質問
「スキーマの合成と改良」レッスンは無料ですか?
はい。「スキーマの合成と改良」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。
「スキーマの合成と改良」で何を学びますか?
refine、transform、ユニオンを使って複雑なスキーマを構築します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「スキーマの合成と改良」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Zodスキーマの基礎
- スキーマからの型推論
- parseとsafeParse
- スキーマの合成と改良