インターフェース vs 型エイリアス
TypeScript では、オブジェクト構造などに型を定義する手段として interface
と type
(型エイリアス) が存在します。
どちらも似た使い方ができますが、それぞれに得意・不得意があります。
🎯 共通点
- オブジェクトの構造を定義できる
- 関数の型、配列、ユニオン型などにも利用可能
- クラスに
implements
できる
🔍 主な違い(比較表)
比較項目 | interface |
type (型エイリアス) |
---|---|---|
オブジェクト型の定義 | ✅ 可能 | ✅ 可能 |
クラスへの適用 | ✅ implements 可能 |
✅ 可能(ただし推奨されにくい) |
拡張(継承) | ✅ extends による継承が可能(複数もOK) |
✅ & による合成で対応 |
ユニオン・交差型 | ❌ 非対応 | ✅ | , & を使った柔軟な定義が可能 |
宣言のマージ(合体) | ✅ 同名であれば自動的に結合される | ❌ 同名で型が異なる場合 |
型の再定義 | ⛔ 不可(ただし拡張可能) | ⛔ 不可(名前の再利用はコンパイルエラー) |
複雑な型の表現 | △ 制限あり(オブジェクト指向向け) | ✅ 柔軟に定義可能(ジェネリック・条件型など) |
✅ 使い分けの指針
シチュエーション | おすすめ |
---|---|
オブジェクトの構造やクラスの契約を定義したい | interface |
ユニオン型・条件型・再利用重視の複雑な型 | type |
ライブラリの公開APIやクラス連携 | interface |
型の合成・ジェネリック再利用が多い設計 | type |
📌 実務のベストプラクティス
- 構造的なオブジェクトの定義は
interface
を基本とし、複雑な型操作が必要な場面でtype
を使う type
しかできない構文がある(ユニオン型、条件型、Mapped Types など)ので、状況に応じて併用が最適
✅ まとめ
// interface: 拡張・クラス連携に強い
interface A { foo: string }
interface B extends A { bar: number }
// type: 柔軟な型表現に強い
type C = A & { bar: number }
TypeScript では「どちらでも書ける」ことが多いですが、型の役割と将来の拡張性に応じて選択するのがベストです。