🐰

TypeScript における schema と type の違い

2025/01/22に公開

これは何?

  • schematype の違いってなんだっけ…となった時にChatGPTに聞いた時のメモ。

schema と type

1. schema(Zod スキーマなど)

  • 定義目的: スキーマはデータ構造やバリデーションルールを定義するためのものです。

  • ランタイムで利用可能: スキーマはランタイムでも使えるため、データの検証(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>;
    

2. type

  • 定義目的: TypeScript の型(typeinterface)は、コンパイル時に型チェックを行うために使用します。
  • コンパイル時限定: 型は TypeScript のコンパイラが解釈するもので、ランタイムには存在しません。
  • 軽量でシンプル: 型定義はあくまで型安全を保証するだけであり、データの検証は行いません。
  • コード例:
    export type GenerateTestCodeResponse = {
      code: string;
      chatCmpl: string;
    };
    
    const data: GenerateTestCodeResponse = { code: "123", chatCmpl: "ok" }; // 型チェックのみ
    

違いのまとめ

特性 schema type
目的 データ構造 + バリデーション 型安全性の保証
ランタイムで利用 可能 不可能
データ検証 バリデーション可能 不可能(型チェックのみ)
生成可能性 型を生成可能 (z.infer) スキーマ生成不可
用途 入力データの検証や整形 コードの型チェック

選択の基準

  • データの検証が必要な場合: スキーマ(Zod など)を使うのがおすすめ。
  • 型チェックだけで十分な場合: TypeScript の型(typeinterface)で十分。

例: 両者を併用する

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