TypeScriptで複数のインターフェースを合成する方法(交差型との比較)
生徒
「TypeScriptでインターフェースを使ってオブジェクトの形を決められるのは分かりました。でも、もし複数のインターフェースをまとめて使いたいときはどうすればいいですか?」
先生
「良い質問ですね。TypeScriptでは、複数のインターフェースを合成する方法があります。具体的には extends を使った継承や、& を使った交差型を利用することができます。」
生徒
「インターフェースを合成するときに、どんな違いがあるんですか?」
先生
「それでは、実際のコード例を見ながら、インターフェースの合成方法と交差型との違いを一緒に学んでいきましょう。」
1. 複数のインターフェースを合成するとは?
TypeScript(タイプスクリプト)では、オブジェクトの形を「インターフェース(interface)」で定義することができます。インターフェースを使うことで、どんなプロパティ(データの項目)が必要かをあらかじめ決めておけるため、ミスを防いで安全にプログラムを書くことができます。
しかし、現実のプログラミングでは「ひとつのオブジェクトが複数の性質を持つ」ことがよくあります。たとえば「人」であり「社員」でもあるような場合です。このようなときに役立つのが、複数のインターフェースを合成する方法です。
2. extendsを使ってインターフェースを合成する方法
extends は「継承」と呼ばれる仕組みで、あるインターフェースをベースにして新しいインターフェースを作る方法です。複数のインターフェースを extends でまとめることができます。
interface Person {
name: string;
}
interface Employee {
employeeId: number;
}
interface Manager extends Person, Employee {
department: string;
}
const boss: Manager = {
name: "田中",
employeeId: 101,
department: "営業部"
};
{ name: '田中', employeeId: 101, department: '営業部' }
この例では Manager が Person と Employee を合成し、さらに department という独自のプロパティを追加しています。これにより「人」であり「社員」であり、さらに「部門情報を持つマネージャー」というインターフェースを作ることができます。
3. 交差型(Intersection Type)を使った合成
もうひとつの方法は、&(アンパサンド)を使う「交差型(Intersection Type)」です。これは「両方の型を同時に満たすもの」という意味になります。
interface Person {
name: string;
}
interface Employee {
employeeId: number;
}
type Manager = Person & Employee & {
department: string;
};
const boss: Manager = {
name: "鈴木",
employeeId: 202,
department: "開発部"
};
{ name: '鈴木', employeeId: 202, department: '開発部' }
この方法では type を使って新しい型を定義し、その中で Person と Employee を & でつなげています。さらに、追加のプロパティを直接書き込むこともできます。
4. extendsと交差型の違い
どちらの方法も複数のインターフェースを合成できますが、それぞれの使いどころがあります。
extendsは「新しいインターフェースを作る」ときに便利です。明確に「AはBの一種である」と表現したい場合に向いています。&を使う交差型は「型を一時的に合成する」ときに便利です。柔軟に複数の型を組み合わせられるため、再利用性が高いです。
たとえるなら、extends は「家族を増やすような継承」、交差型は「その場で性質を掛け合わせて使うレシピ」のようなものです。
5. どちらを使うべきか?
どちらを使っても結果は似ていますが、読みやすさやチームでの理解のしやすさを考えると状況に応じて選ぶのがよいでしょう。
- インターフェースとして長く使う設計 →
extendsが適している - 一時的な型の合成や柔軟性を重視 →
&(交差型)が適している
実際の開発では、両方をバランスよく使うことが大切です。
まとめ
TypeScriptで複数のインターフェースを合成する方法は、プログラム全体の設計をわかりやすく保ちながら、柔軟に型を組み合わせられる強力な仕組みです。特に、インターフェースを継承するextendsと、型を掛け合わせる交差型の&は、それぞれ異なる場面で役立つ重要な技法です。実際の開発では、オブジェクトが複数の役割や属性を持つことが自然に起こるため、インターフェースの合成を理解しておくことは、安全で拡張しやすいコードを書くための大きな助けになります。
また、複雑なデータ構造を扱うときでも、インターフェースをうまく組み合わせることで、読みやすく信頼性の高いコードを保てます。インターフェース設計の指針として、長く再利用される設計にはextendsを、柔軟に動的な型を作りたい場面では交差型を使うとよいでしょう。どちらの手法もTypeScriptが持つ型安全性を最大限に引き出すために欠かせない考え方であり、プロジェクトの規模が大きくなるほどその価値が高まります。
下記のサンプルプログラムでは、記事本文と同じクラス名やコードスタイルを使いながら、複数のインターフェースを合成する別の例を示しています。実際の開発でも似た構造を作る機会は多く、複数の属性を兼ね備えるエンティティ設計の練習として役立つはずです。
追加のサンプルプログラム
interface Timestamp {
createdAt: string;
updatedAt: string;
}
interface User {
id: number;
name: string;
}
interface AdminUser extends User, Timestamp {
role: "admin";
}
const admin: AdminUser = {
id: 1,
name: "管理者ユーザー",
createdAt: "2024-01-01",
updatedAt: "2024-02-01",
role: "admin"
};
インターフェースを複数組み合わせることで、より意味のある型が生まれます。このように、ひとつのオブジェクトが複数の性質を持つ場面は非常に多く、現実のアプリケーション開発では必ず直面します。TypeScriptを使って安全に型を組み合わせることで、エラーを防ぎながら、開発メンバー全員が同じ認識でデータ構造を扱えるようになります。 また、交差型を使った組み合わせも、柔軟な型表現に大いに役立ちます。たとえば、APIレスポンスを一時的に拡張したい場合や、複数の条件をまとめた複合的な型を作りたい場合など、交差型を使うとその場で必要な性質をまとめられます。両者の特徴を理解し、状況に応じて最適な方法を選べるようになることが、TypeScriptの実力を最大限に発揮する鍵です。
生徒
「今日の内容で、インターフェースを合成する理由がよく分かりました。複数の性質を持つオブジェクトって現実的に多いんですね。」
先生
「その通りです。TypeScriptでは、ひとつの型だけでは表現しきれない性質がある場合に、複数のインターフェースを組み合わせることでデータの形をより明確にできます。」
生徒
「extends と & の違いも理解できました。長く使う型には継承が向いていて、柔軟に作る型には交差型が向いているんですよね。」
先生
「その通りです。どちらも便利ですが、目的によって使い分けることでより読みやすく、保守しやすいコードになります。実際の開発では両方を使う場面が必ず出てきますよ。」
生徒
「もっと色々な型の組み合わせを試してみます。実務で役立つ設計の練習にもなりそうですね!」
先生
「はい。その調子で、インターフェース設計を深めていきましょう。型を意識して書くことがTypeScriptの強みを最大限に活かす第一歩です。」