0Pricing
TypeScript Academy · レッスン

スキーマからの型推論

Zodスキーマから静的型を直接導出します。

「スキーマからの型推論」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

スキーマは型情報を持つ

Zodのスキーマは、自身が検証するTypeScriptの型を把握しています。z.inferでその型を取り出せるため、形状を一度だけ記述すれば済みます。

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
// User is { name: string; age: number }

z.inferユーティリティ

z.infer<typeof schema>は、そのスキーマが検証する静的な型を生成します。typeofに注目してください。渡すのはスキーマの値です。

import { z } from "zod";
const tagSchema = z.array(z.string());
type Tags = z.infer<typeof tagSchema>; // string[]

単一の信頼できる情報源

推論を使わない場合、型とスキーマを別々に管理する必要があり、両者にずれが生じる可能性があります。z.inferを使えば、両者を完全に同期できます。

import { z } from "zod";
const schema = z.object({ id: z.number(), email: z.string() });
type Account = z.infer<typeof schema>;
// Change the schema, the type updates automatically.

ネストされた型を推論する

推論はネストされたオブジェクトや配列にも対応しており、1つのスキーマから完全にネストされたTypeScriptの型を生成します。

import { z } from "zod";
const postSchema = z.object({
  title: z.string(),
  author: z.object({ name: z.string() }),
  tags: z.array(z.string())
});
type Post = z.infer<typeof postSchema>;
// Post.author.name is string

推論された型を使う

推論された型は、手書きの型と同じ場所で使えます。関数の引数、変数、戻り値の型などに利用できます。

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
function greet(u: User): string {
  return "Hi " + u.name;
}

parseは推論された型を返す

schema.parseは、推論された型としてすでに型付けされた値を返すため、その後のコードも完全に型付けされます。

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
const raw: unknown = { name: "Ada", age: 36 };
const user: User = userSchema.parse(raw); // typed and validated

型におけるoptionalとnullable

スキーマの修飾子は推論された型にも反映されます。.optional()を付けたフィールドは、TypeScriptでもオプショナルになります。

import { z } from "zod";
const schema = z.object({
  name: z.string(),
  nickname: z.string().optional()
});
type P = z.infer<typeof schema>;
// P is { name: string; nickname?: string }

オブジェクトの配列から推論する

z.arrayとz.objectを組み合わせると、推論された型はオブジェクト型の配列になります。

import { z } from "zod";
const usersSchema = z.array(z.object({ id: z.number() }));
type Users = z.infer<typeof usersSchema>;
// Users is { id: number }[]

typeofが必要な理由

スキーマは値なので、z.inferに渡す前にtypeof schemaを使ってその型を参照します。

import { z } from "zod";
const s = z.string();
type S = z.infer<typeof s>; // string
// z.infer<s> would be wrong: s is a value, not a type.

モジュール境界を越えた推論

スキーマと推論された型の両方をエクスポートすると、他のモジュールでも同じ形状を一貫して検証し、利用できます。

import { z } from "zod";
export const userSchema = z.object({ name: z.string() });
export type User = z.infer<typeof userSchema>;
// Consumers import both the runtime schema and the type.

1つの定義で2つの世界に対応する

スキーマは実行時検証を担い、z.inferはコンパイル時の型付けを担います。1つの宣言で両方を支えられるため、重複をなくせます。

import { z } from "zod";
const configSchema = z.object({ port: z.number(), host: z.string() });
type Config = z.infer<typeof configSchema>;
// Validate at runtime, type at compile time, no drift.

確認問題:型の推論

スキーマからの型の推論について理解度を確認します。

まとめ:スキーマから型を推論する

z.infer<typeof schema>でZodスキーマからTypeScriptの型を導出できることを学びました。これにより、ネスト、オプショナル、配列の形状を含め、検証と型付けにおける単一の信頼できる情報源を得られます。

import { z } from "zod";
const userSchema = z.object({ name: z.string(), age: z.number() });
type User = z.infer<typeof userSchema>;
// User stays in sync with the schema automatically.

よくある質問

「スキーマからの型推論」レッスンは無料ですか?

はい。「スキーマからの型推論」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「スキーマからの型推論」で何を学びますか?

Zodスキーマから静的型を直接導出します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「スキーマからの型推論」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Zodスキーマの基礎
  2. スキーマからの型推論
  3. parseとsafeParse
  4. スキーマの合成と改良
← TypeScript Academyに戻る