TypeScriptにおいて、interfaceはメソッドやプロパティを備える型、typeはプリミティブ型の延長的な型の定義に使う。

とはいえ、interfaceの大部分の機能をtypeも持っている。どちらを使うべきか迷うケースは少なくない。

公式ドキュメントによれば、プロジェクトの初期はとりあえずinterfaceを使い、各オブジェクトの役割が明確になってきたら、適宜typeを使うようにするのが無難とのことだ(意訳)。

interfaceとtypeの大きな違い

interfacetypeの大きな違いは、型定義後に変更ができるかどうかにある。

interfaceは、同名のインターフェースを定義すると自動で1つにまとめてくれる。

ts
interface objX {
  x: number;
}
interface objX {
  y: number;
}

const v: objX = {
  x: 0,
  y: 0,
};

typeにはこうした機能がない。

ts
type objX = {
  x: number;
};
type objX = {
  y: number;
};

const v: objX = {
  x: 0,
  y: 0,
};

// 👇こんな感じのエラーが出る
// Duplicate identifier 'objX'.
// Object literal may only specify known properties, and 'y' does not exist in type 'objX'.

参考資料

TypeScript: Documentation – Everyday Types