interface インターフェース(継承と宣言マージを含む)
最終更新:2026-10-22
interface インターフェース(継承と宣言マージを含む)
interface は 1 つの名前でオブジェクトの構造を記述します。どのプロパティやメソッドがあり、それぞれの型は何かを規定します。コンパイル時にのみ存在し(トランスパイル後は完全に消えます)、extends による継承と同名の宣言マージをサポートします。type エイリアスと並ぶ 2 大の型定義方式の 1 つです。
| グループ | 型の組み合わせ |
|---|---|
| 種類 | 構文 |
| strict モード | 不要 |
ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。
📝 構文
interface Animal {
name: string;
speak(): void;
}
// インターフェースの継承
interface Pet extends Animal {
owner: string;
}
// 宣言マージ:同名の interface はメンバーを自動的にマージする
interface Window { title: string }
interface Window { version: number }
⚙️ パラメータ
| extends | 1 つ以上のインターフェースを継承し、そのすべてのメンバーを獲得します |
|---|---|
| ?: | オプショナルプロパティのマーク。このプロパティが存在しなくてもよいことを許します |
| readonly | 読み取り専用の修飾子。代入後は変更できません |
戻り値:戻り値はありません。interface は純粋な型レベルの概念であり、実行時コードを一切生成しません。
▶ サンプル
下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:
出力:
Tom Jerry
Meow
(トランスパイル後の実行出力。型チェックは tsc が行います。name を数値に変えると error TS2322 が得られます)
💡 ポイント
ℹ️ 説明 interface はトランスパイル後に完全に消え、実行時のオーバーヘッドはゼロです。コンパイラに見せる「構造の説明書」にすぎません。
💡 ヒント 同名の interface は自動的にマージされます(宣言マージ)。これはサードパーティライブラリの型を拡張する(例えば window にカスタムフィールドを追加する)標準的な手法です。
⚠️ 注意 interface と type エイリアスはほとんどの場面で交換可能です。ユニオン/マップ/条件型などの型演算が必要な場合は type しか使えず、宣言マージが必要な場合は interface しか使えません(チュートリアルの第 9/11 課に完全な比較表があります)。
🏷️ 関連型の組み合わせ
💡 関連ケース
ケースは今後追加予定です。
📚 関連チュートリアル
❓ よくある質問
Q interface と type の違いは何ですか?
A 両方ともオブジェクトの構造を定義し、日常的には交換可能です。interface は extends と宣言マージをサポートします。type はユニオン、タプル、マップ型、条件型など任意の型演算を表現できます。チームの約束でどちらか 1 つに決めれば十分で、混用は控えめにしてください。
Q interface は関数、配列、クラスを記述できますか?
A できます。呼び出しシグネチャ((x: number): string)は関数を、インデックスシグネチャ([i: number]: T)は配列を、new シグネチャはコンストラクタを記述し、クラスは implements でインターフェースを実装します。
Q 宣言マージとは何ですか?いつ役立ちますか?
A 同名の 2 つの interface のメンバーは自動的に 1 つにマージされます。典型的な用途は、サードパーティライブラリの window や Request などの型にカスタムフィールドを補い、ライブラリのソースコードを変更せずに済ませることです。