PR

【TypeScript】typeとは?型エイリアスとinterfaceの違いを初心者向けに解説

TypeScriptのtypeが長い型やユニオン型に読みやすい名前を付けることを表すアイキャッチ TypeScript

TypeScriptのtypeとは、型に名前を付けて、何度も使いやすくするための書き方です。正式には型エイリアスと呼ばれます。

たとえば、ユーザー情報を表す型を毎回{ id: number; name: string }と書くのは読みにくくなります。そこでtype User = ...のように名前を付けます。

初心者が迷いやすいのは、typeinterfaceの違いです。どちらもオブジェクトの形を表せますが、得意な使いどころが少し違います。

最初は「typeは型に名前を付ける」「interfaceはオブジェクトの形を宣言する」と分けて考えると理解しやすいです。

この記事では、TypeScriptのtypeとは何か、基本構文、union型での使い方、interfaceとの違い、実務での使い分けを初心者向けに解説します。

スポンサーリンク

まず結論:typeは型に名前を付ける書き方

typeは、型に別名を付けるために使います。TypeScript公式ドキュメントでも、type aliasは任意の型に名前を付けるものとして説明されています。

type User = {
  id: number;
  name: string;
};

const user: User = {
  id: 1,
  name: "Sato",
};

この例では、{ id: number; name: string }というオブジェクトの型に、Userという名前を付けています。

一度名前を付けると、変数、関数の引数、戻り値などで同じ型を使い回せます。

typeが必要になる理由

TypeScriptでは、型を直接書くこともできます。

function printUser(user: { id: number; name: string }) {
  console.log(user.name);
}

短いコードならこれでも問題ありません。しかし、同じ型を何度も書くと、コードが長くなり、修正漏れも起きやすくなります。

typeを使うと、型の意味が名前で分かるようになります。

type User = {
  id: number;
  name: string;
};

function printUser(user: User) {
  console.log(user.name);
}

このように、typeはコードを短くするためだけでなく、型の意味を名前で伝えるために使います。

typeの基本構文

typeの基本構文は次の通りです。

type 型名 = 型;

オブジェクト型に名前を付ける場合は、次のように書きます。

type Product = {
  id: number;
  name: string;
  price: number;
};

関数の引数や戻り値にも使えます。

function formatProduct(product: Product): string {
  return `${product.name}: ${product.price}円`;
}

TypeScriptの型注釈や関数の基本がまだ曖昧な場合は、TypeScript超入門TypeScriptの関数宣言/関数式を先に読むと理解しやすくなります。

typeはunion型にも名前を付けられる

typeの大きな特徴は、オブジェクト型だけでなく、union型にも名前を付けられることです。

type ID = number | string;

function findUser(id: ID) {
  console.log(id);
}

number | stringは、「数値または文字列」という意味です。このような型をunion型と呼びます。

毎回number | stringと書く代わりにIDと名付けることで、「これはIDとして扱う値だ」と読み取りやすくなります。

この図では、typeを「型そのものを作る魔法」ではなく、型に名前を付けて使いやすくする入口として見てください。

TypeScriptのtypeがオブジェクト型やユニオン型に名前を付けinterfaceと使い分けられることを示す図
typeは型に名前を付ける書き方です。interfaceと似ていますが、union型などにも名前を付けられる点が重要です。

interfaceとの違い

typeinterfaceは、どちらもオブジェクトの形を表せます。

type UserType = {
  id: number;
  name: string;
};

interface UserInterface {
  id: number;
  name: string;
}

この例だけを見ると、ほとんど同じに見えます。実際、単純なオブジェクト型であれば、どちらでも表せます。

観点typeinterface
オブジェクト型表せる表せる
union型表せる基本的には表せない
tuple型表せる向いていない
後から同じ名前で拡張できないできる
クラスのimplements使える場合があるよく使われる

TypeScript公式ドキュメントでも、ほとんどのinterfaceの機能はtypeでも使える一方、interfaceは後から拡張できる点が大きな違いとして説明されています。

すでにTypeScriptのinterfaceを読んでいる場合は、この記事と合わせて見ると使い分けが整理しやすくなります。

typeを使うとよい場面

typeは、次のような場面で特に便利です。

  • union型に名前を付けたい
  • tuple型に名前を付けたい
  • 関数型に名前を付けたい
  • 複数の型を組み合わせたい
  • APIレスポンスの型を読みやすく整理したい

たとえば、状態を文字列で表す場合はtypeが分かりやすいです。

type Status = "loading" | "success" | "error";

function render(status: Status) {
  if (status === "loading") {
    return "読み込み中";
  }
  if (status === "success") {
    return "成功";
  }
  return "エラー";
}

このように書くと、statusには決められた文字列だけを渡せます。入力ミスにも気づきやすくなります。

interfaceを使うとよい場面

一方、interfaceは、オブジェクトの形を中心に扱う場面でよく使われます。

  • クラスに実装させる契約を表したい
  • オブジェクトの構造を外部に公開したい
  • ライブラリや拡張前提の型を定義したい
  • 同じ名前のinterfaceを後から拡張したい

たとえば、クラスが持つべきメソッドを表す場合はinterfaceが読みやすいことがあります。

interface Repository {
  findById(id: string): Promise<User>;
  save(user: User): void;
}

ただし、これは絶対ルールではありません。プロジェクトごとのコーディング規約がある場合は、それに従うのが実務では重要です。

初心者がつまずきやすいポイント

つまずきまずこう理解する
typeは新しい型を作る?別名を付けているだけ。別の実体が増えるわけではない
interfaceと完全に同じ?似ているが、union型や拡張方法が違う
全部typeでよい?規約や拡張前提によってinterfaceが向く場面もある
実行時にも残る?TypeScriptの型情報なので、基本的にJavaScript実行時には残らない

特に重要なのは、typeは実行時の値ではなく、開発中にコードを安全に読むための型情報だという点です。

実務での使い分けの目安

迷ったときは、次のように考えると整理しやすくなります。

使いたいものおすすめ理由
union型type"a" | "b"のような型に名前を付けられる
tuple型type配列の位置ごとの型を表しやすい
単純なデータの形どちらでもよいプロジェクト規約に合わせる
拡張される契約interface後から拡張しやすい

初心者のうちは、まずtypeでunion型、interfaceでオブジェクトの契約、と覚えると混乱しにくくなります。

関連して読みたい記事

まとめ

TypeScriptのtypeは、型に名前を付けるための書き方です。

  • 同じ型を何度も書かずに済む
  • 型の意味を名前で伝えられる
  • union型やtuple型にも名前を付けられる
  • interfaceとは拡張方法や得意分野が違う

最初は、type ID = number | stringのような短い例から始めると理解しやすくなります。慣れてきたら、APIレスポンスや画面状態の型にも使ってみましょう。

タイトルとURLをコピーしました