目次
					
					
					
					
TypeScriptのtypeとinterfaceの違いを完全解説!
TypeScriptを学び始めると必ずぶつかる疑問。それが typeとinterfaceの違い です。
「どっちを使えばいいの?」「書き方は似てるけど、何が違うの?」
そんなモヤモヤを一発解消できるように、実例付きで徹底解説します!
typeとinterface、まずは基本の書き方をおさらい
typeの定義方法
type User = {
  name: string;
  age: number;
};interfaceの定義方法
interface User {
  name: string;
  age: number;
}見た目はほとんど同じ。でも、使い分けには明確な「違い」があります。
ズバリ!typeとinterfaceの違いまとめ
| 比較項目 | type | interface | 
|---|---|---|
| 拡張性 | 交差型(&)で拡張 | extendsで拡張 | 
| ユニオン型 | 使える | 使えない | 
| タプル型 | 使える | 使えない | 
| 宣言のマージ | できない | できる | 
| Reactとの相性 | Props定義に◎ | クラスベースで◎ | 
専門用語のミニ解説
- ユニオン型(Union Type):複数の型のいずれかであることを示す型です。
 例:type Status = "loading" | "success" | "error";
- タプル型(Tuple Type):配列のようなものですが、要素の数と型が固定されています。
 例:type Point = [number, number];
- 交差型(Intersection Type):複数の型を合成する型です。
 例:type A = { id: number } & { name: string };
typeを使うべきシーン
- ユニオン型やタプル型を使いたいとき
- 既存型を組み合わせて新しい型を作るとき
- 柔軟な型定義が必要なとき
- オブジェクト以外の型(プリミティブや関数、配列など)を定義したいとき
type Status = "loading" | "success" | "error";
type Point = [number, number];
type Callback = (value: number) => void;
type UserId = string | number;ここが重要: typeはオブジェクト以外の型にも使えるのが最大の強みです。
interfaceを使うべきシーン
- オブジェクトの構造を定義したいとき
- 複数の場所で拡張・マージしたいとき
- ライブラリ向けの型定義など
interface Animal {
  name: string;
}
interface Dog extends Animal {
  breed: string;
}注意: interfaceは基本的にオブジェクトの型にしか使えません。タプル型やユニオン型、関数型などは扱えないため、汎用性はtypeの方が高いです。
結論:迷ったらこう使い分けよう!
オブジェクト中心 → interface
型の合成や複雑な表現 → type
配列・関数・プリミティブ型 → 迷わずtype
どちらを使っても機能的には同じことが多いですが、
拡張性と可読性を意識して使い分けることで、より読みやすく保守しやすいコードになります!
おまけ:実務ではどうしてる?
現場では「ルールを決めて統一して使う」ことが最重要!
チームでtypeに統一してるプロジェクトもあれば、interfaceをメインで使っているところもあります。
TypeScript公式も「どちらでもよい」としているため、プロジェクトの方針とチームの合意を優先しましょう。
まとめ
- type → 柔軟な型定義、ユニオン型・タプル型・関数型などもOK
- interface → オブジェクト構造の定義、宣言マージが可能、拡張しやすい
- 迷ったらtype、でもオブジェクト中心ならinterfaceも◎
 
					        