Quantcast
Channel: jun01tの日記
Viewing all articles
Browse latest Browse all 87

TypeScriptのtypeとinterfaceの違い

$
0
0

TypeScriptのtypeinterfaceは、どちらも型を定義するための機能ですが、いくつかの違いがあります。それぞれの特性と違いを簡単に説明します。


1. 定義の用途とシンタックス

  • interface
    主にオブジェクトの形状を定義するために使われます。クラスとの相互作用(implements)にもよく使われます。
  interface Person {
    name: string;
    age: number;
  }
  • type
    より汎用的で、オブジェクト以外の型(ユニオン型、交差型、プリミティブ型など)も定義可能です。
  type Person = {
    name: string;
    age: number;
  };

  type ID = string | number;

2. 拡張(継承)

  • interface
    複数のインターフェースを拡張(extends)できます。
  interface Person {
    name: string;
  }
  interface Employee extends Person {
    role: string;
  }
  • type
    エイリアス同士を交差型(&)で組み合わせることで拡張します。
  type Person = {
    name: string;
  };
  type Employee = Person & {
    role: string;
  };

3. 再定義

  • interface
    同名のインターフェースを複数回定義すると、マージ(統合)されます。
  interface Person {
    name: string;
  }
  interface Person {
    age: number;
  }

  // 結果
  const person: Person = { name: "Alice", age: 30 };
  • type
    同名の型エイリアスを再定義するとエラーになります。
  type Person = {
    name: string;
  };
  type Person = {
    age: number; // エラー
  };

4. 使用の柔軟性

  • type
    より柔軟で、ユニオン型や交差型などをサポートします。
  type ID = string | number; // ユニオン型
  type Point = { x: number } & { y: number }; // 交差型
  • interface
    オブジェクトの形状やクラスの実装向きで、ユニオン型は扱えません。

5. クラスとの相互作用

  • interface
    クラスの実装(implements)に直接使えるため、クラス設計に適しています。
  interface Animal {
    name: string;
    speak(): void;
  }

  class Dog implements Animal {
    name: string;
    constructor(name: string) {
      this.name = name;
    }
    speak() {
      console.log("Woof!");
    }
  }
  • type
    クラスのimplementsには使えません。

選択の基準

  • オブジェクトやクラス設計に関する型:interface
  • ユニオン型や交差型を含む複雑な型:type
  • 型の再利用性が重要な場合:interface

最近のTypeScriptでは、typeinterfaceの機能がかなり近くなってきていますが、目的に応じて適切な方を選ぶと良いでしょう。


Viewing all articles
Browse latest Browse all 87

Trending Articles