PR

【TypeScript】typeとは?interfaceとの違いと使い分け

TypeScriptのtypeが型の形に名前を付けて再利用することを表す統一フォーマットのアイキャッチ TypeScript

TypeScriptのtypeとは、型に名前を付けて、読みやすく再利用できるようにする書き方です。

長いオブジェクト型、複数の候補を持つunion型、関数の引数や戻り値の型を、そのまま毎回書くとコードが読みにくくなります。typeを使うと、それらの型に意味のある名前を付けられます。

typeはJavaScriptの値を作る命令ではありません。TypeScriptの型チェックで使う「型の名前」です。

この記事では、typeの基本構文、union型で便利な理由、interfaceとの違い、実務での使い分けを初心者向けに整理します。

スポンサーリンク

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

TypeScript公式ドキュメントでは、同じ型を何度も参照するために名前を付けられる仕組みとしてtype aliasが説明されています。まずは「型の別名を作る」と考えると分かりやすいです。

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

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

この例では、{ id: number; name: string }という型にUserという名前を付けています。以後は、同じ型をUserとして読めます。

typeが必要になる理由

型をその場に直接書くこともできます。しかし、同じ型が複数箇所に出てくると、コードの意味が追いにくくなります。

function send(user: { id: number; name: string; email?: string }) {
  // ...
}

function save(user: { id: number; name: string; email?: string }) {
  // ...
}

このような型は、typeで名前を付けると、何を表すデータなのかが分かりやすくなります。

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

function send(user: User) {
  // ...
}

function save(user: User) {
  // ...
}

typeの価値は、短くすることではなく、型に意味のある名前を付けることです。

typeの読み方を図で見る

次の図では、typeを「型を書く、名前を付ける、何度も使う」という流れで見てください。型の分類名より先に、再利用の流れを理解するのがポイントです。

TypeScriptのtypeが型に名前を付けて変数や関数で再利用される流れを示す図
typeは長い型や繰り返し使う型に、意味のある名前を付けるための書き方です。

union型に名前を付けると便利

typeは、オブジェクト型だけでなく、複数の候補を持つunion型にも名前を付けられます。

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

let currentStatus: Status = "loading";

このように書くと、Statusには指定した文字列だけを入れられます。画面の状態、APIの結果、処理ステータスなどを表すときに便利です。

typeは実行時の値を作らない

初心者が混同しやすいのは、typeがJavaScriptのオブジェクトや変数を作るわけではない点です。TypeScriptの型は、基本的にコンパイル時のチェックに使われます。

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

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

実際に存在する値はuserです。Userは、その値がどんな形であるべきかを確認するための型名です。

interfaceとの違い

typeinterfaceは、どちらもオブジェクトの形に名前を付けられます。そのため、簡単なオブジェクト型だけを見ると似ています。

比較typeinterface
オブジェクト型に名前を付けるできるできる
union型に名前を付ける得意できない
既存の型を組み合わせるintersectionなどで表現しやすいextendsで表現しやすい
同じ名前の再宣言基本的にできない宣言マージがある

TypeScript公式ドキュメントでも、typeとinterfaceは多くの場面で似ており、必要な機能が出てくるまでは個人の好みで選べるという考え方が示されています。

typeを使うとよい場面

  • union型に名前を付けたい
  • 文字列リテラルの候補を管理したい
  • 関数の引数や戻り値の型を短く読みたい
  • 複数の型を組み合わせて別名を付けたい
type ApiResult =
  | { ok: true; data: string[] }
  | { ok: false; message: string };

このような「成功か失敗かで形が変わるデータ」は、typeで表すと読みやすくなります。

interfaceを使うとよい場面

interfaceは、オブジェクトの形を拡張していく場面でよく使われます。クラスの実装条件や、ライブラリの型定義でもよく見かけます。

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

interface AdminUser extends User {
  role: "admin";
}

初心者のうちは、union型や文字列候補ならtype、オブジェクトの形を拡張したいならinterfaceと考えると判断しやすいです。

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

つまずき理解のしかた
typeを値だと思うtypeは型チェック用の名前
typeとinterfaceを完全に別物だと思うオブジェクト型では似ている場面が多い
何でもtypeで巨大化する複雑なら小さな型に分ける
型名が抽象的すぎるUser、Status、ApiResultのように意味で名付ける

type名の付け方

typeは型を短くするためだけに使うものではありません。型名を見たときに、そのデータが何を表すのか分かることが大切です。

たとえば、DataValueだけでは意味が広すぎます。ユーザー情報ならUser、画面状態ならPageStatus、APIの返却結果ならApiResultのように、役割が分かる名前を付けると読みやすくなります。

type PageStatus = "idle" | "loading" | "success" | "error";

type UserSummary = {
  id: number;
  displayName: string;
};

名前を付けることで、関数の引数や戻り値を見ただけで、コードの意図を追いやすくなります。これは型安全性だけでなく、チームで読むコードの分かりやすさにも効きます。

型を直すときの考え方

実務では、最初に作った型があとから変わることがあります。たとえば、APIの返却項目が増えたり、ステータスの種類が増えたりする場合です。

このとき、同じ型を複数箇所へ直接書いていると、修正漏れが起きやすくなります。typeで名前を付けておけば、変更する場所を集約しやすくなります。

ただし、何でも1つの巨大な型にまとめると、逆に読みにくくなります。画面用、API用、保存用など、役割が違う型は分けて名前を付けるのが現実的です。

チームで読むコードとしてのtype

TypeScriptの型は、自分のためだけでなく、あとから読む人への説明にもなります。関数の引数にUserと書かれていれば、その関数がユーザー情報を受け取ることがすぐ分かります。

逆に、毎回長いオブジェクト型を直接書いていると、同じ意味の型なのか、少し違う型なのかを判断しづらくなります。共有して使う型には名前を付け、画面の中だけで一度しか使わない型は無理に外へ出さない、という線引きが実務では扱いやすいです。

公式情報と関連して読みたい記事

まとめ

TypeScriptのtypeは、型に名前を付けて読みやすく再利用するための書き方です。

  • 長い型に意味のある名前を付けられる
  • union型や文字列リテラル型と相性がよい
  • 実行時の値を作るものではない
  • interfaceとは似ているが、得意な場面が少し違う
タイトルとURLをコピーしました