本文へスキップ
BecomeCoder

TypeScriptコース · 第7章 モダンTSと設定 · レッスン25

宣言マージ ― 同じ名前の interface をまとめる

ブラウザで完結

導入

ライブラリが用意している型(たとえば Window など)に、自分でプロパティを追加したいことがあります。TypeScript では、同じ名前の interface を複数回書くと、自動的に1つにまとめられます。これを宣言マージ(declaration merging)と呼びます。

説明

同じ名前で interface を2回書くと、両方のプロパティを持つ1つの型として扱われます。

interface Config {
  host: string;
}

interface Config {
  port: number;
}

// Config は自動的に { host: string; port: number } にマージされる
const config: Config = { host: "localhost", port: 8080 };
console.log(config.host, config.port);

type エイリアスは同じ名前で2回定義するとエラーになりますが、interface はこのように複数回書けて、それらが1つにまとまる点が大きな違いです。ライブラリの型定義に自分の型を足す「モジュール拡張」(module augmentation)でも、この仕組みが使われています。

やってみよう

interface Config { timeout: number; } を3つ目として追加し、configtimeout: 5000 を足して console.log(config.timeout) を試してみましょう。

演習

interface Animal { name: string; }interface Animal { sound: string; } を別々に宣言してマージしてください。Animal 型の変数 catname: "猫", sound: "ニャー" を入れ、console.log(cat.sound) で表示してください。

ヒント1を見る

同じ名前で interface Animal { name: string; }interface Animal { sound: string; } を別々に書きます。

ヒント2を見る

const cat: Animal = { name: "猫", sound: "ニャー" }; console.log(cat.sound);

実際に動かしてみよう

下のエディタにTypeScriptを書いて「実行」を押すと、その場でJavaScriptに変換してブラウザ内で実行し、出力が表示されます。本文の例をそのまま試したり、型注釈を書き換えたりしてみましょう(console.log の結果が下に出ます。初回だけコンパイラの読み込みに少し時間がかかります)。

TypeScript — ブラウザ内で実行

TypeScriptコンパイラ(同梱)でTS→JSに変換してから実行する学習用環境を読み込みます(初回のみコンパイラの読み込みに少し時間がかかります)。
スクロールして表示された時点でも自動で読み込まれます。