TypeScriptのtypeinterfaceの違いを完全解説!

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