宣言のマージ とは、TypeScript が 同じ名前 を持つ複数の宣言を1つの定義に結合することです。インターフェース、名前空間、そしてその他いくつかの構文は自動的にマージされます。
インターフェースのマージ
ts
interface Box { width: number; }
interface Box { height: number; }
// Box is now { width: number; height: number } — both merged
宣言のマージ とは、TypeScript が 同じ名前 を持つ複数の宣言を1つの定義に結合することです。インターフェース、名前空間、そしてその他いくつかの構文は自動的にマージされます。
interface Box { width: number; }
interface Box { height: number; }
// Box is now { width: number; height: number } — both merged
これは、自分が所有していないライブラリやグローバルに型を追加する方法です。
// Add a custom property to Express's Request
declare global {
namespace Express {
interface Request { user?: { id: string }; } // merges into Express.Request
}
}
request.user; // ✅ now typed everywhere
// Augment a module
declare module "some-lib" {
interface Options { newOption: boolean; }
}
ライブラリの Request や Options が interface であるため、あなたの宣言は衝突するのではなく マージ されます。これにより、編集できない型を安全に拡張できます。
function greet() {}
namespace greet { export const version = "1.0"; }
greet.version; // "1.0" — namespace merged onto the function
type ではこれができないのかtype A = { x: number };
type A = { y: number }; // ❌ Error: duplicate identifier
型エイリアスは一意です。マージできるのはインターフェース(と名前空間)だけです。これは拡張可能な公開 API の形には interface を使うべき重要な理由の1つです。
宣言のマージは モジュール拡張(module augmentation) の背後にある仕組みです。Express のリクエストの拡張、window への追加、ライブラリ型のカスタマイズ、テーマシステムなどです。
これは、制御できない型をフォークせずに適応させなければならない実際のアプリの型付けにおいて、欠かせない知識です。