🐰
TypeScript における schema と type の違い
これは何?
-
schema
とtype
の違いってなんだっけ…となった時にChatGPTに聞いた時のメモ。
schema と type
schema
(Zod スキーマなど)
1. -
定義目的: スキーマはデータ構造やバリデーションルールを定義するためのものです。
-
ランタイムで利用可能: スキーマはランタイムでも使えるため、データの検証(validation)やデコード(parsing)に利用できます。
-
ツールの役割: 例えば、Zod を使用したスキーマでは、データを安全に型変換することや、無効なデータのチェックを行えます。
-
コード例:
export const GenerateTestCodeResponseSchema = z.object({ code: z.string(), chatCmpl: z.string(), }); // データの検証や型安全なパース const result = GenerateTestCodeResponseSchema.parse({ code: "123", chatCmpl: "ok" });
-
出力型: Zod スキーマから TypeScript の型を生成できます。
export type GenerateTestCodeResponse = z.infer<typeof GenerateTestCodeResponseSchema>;
type
2. -
定義目的: TypeScript の型(
type
やinterface
)は、コンパイル時に型チェックを行うために使用します。 - コンパイル時限定: 型は TypeScript のコンパイラが解釈するもので、ランタイムには存在しません。
- 軽量でシンプル: 型定義はあくまで型安全を保証するだけであり、データの検証は行いません。
-
コード例:
export type GenerateTestCodeResponse = { code: string; chatCmpl: string; }; const data: GenerateTestCodeResponse = { code: "123", chatCmpl: "ok" }; // 型チェックのみ
違いのまとめ
特性 | schema |
type |
---|---|---|
目的 | データ構造 + バリデーション | 型安全性の保証 |
ランタイムで利用 | 可能 | 不可能 |
データ検証 | バリデーション可能 | 不可能(型チェックのみ) |
生成可能性 | 型を生成可能 (z.infer ) |
スキーマ生成不可 |
用途 | 入力データの検証や整形 | コードの型チェック |
選択の基準
- データの検証が必要な場合: スキーマ(Zod など)を使うのがおすすめ。
-
型チェックだけで十分な場合: TypeScript の型(
type
やinterface
)で十分。
例: 両者を併用する
Zod スキーマでデータ検証を行いつつ、型を定義して利用することができます。
// Zod スキーマを定義
export const GenerateTestCodeResponseSchema = z.object({
code: z.string(),
chatCmpl: z.string(),
});
// 型を Zod スキーマから生成
export type GenerateTestCodeResponse = z.infer<typeof GenerateTestCodeResponseSchema>;
// データ検証の実例
const validatedData = GenerateTestCodeResponseSchema.parse({
code: "example-code",
chatCmpl: "example-chat",
}); // 型安全かつデータ検証も可能
Discussion