目次
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も◎