TypeScript - インターフェイスのマージ

TypeScript では、同じ名前のインターフェイスを複数宣言できて、それぞれが1つのインターフェイスにマージされるようです。

どういうことか試してみましょう。

interface User {
 id: number;
 name: string;
}

interface User {
 valid: boolean;
}

function func(user: User) {
    // ...
}

// これはOK
func({
 id: 1,
 name: "A",
 valid: true,
});

// これはコンパイルエラー
/*
func({
   id: 2,
   name: "B",
});
*/
// Supplied parameters do not match any signature of call target:
// Type '{ id: number; name: string; }' is missing property 'valid' from type 'User'.
// Could not select overload for 'call' expression.

lib.d.ts に定義されている interface にメソッドを足す方法がないか調べていたのですが、こういう方法があるんですね。

以下を参考にしました。

TypeScript 0.9.1.1で確認しています。