TypeScriptのtype
とinterface
は、どちらも型を定義するための機能ですが、いくつかの違いがあります。それぞれの特性と違いを簡単に説明します。
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では、type
とinterface
の機能がかなり近くなってきていますが、目的に応じて適切な方を選ぶと良いでしょう。