次のコード
interface IPerson {
firstName: string;
lastName: string;
}
var persons: { [id: string]: IPerson; } = {
"p1": { firstName: "F1", lastName: "L1" },
"p2": { firstName: "F2" }
};
なぜ初期化が拒否されないのでしょうか? 結局のところ、2 番目のオブジェクトには "lastName" プロパティがありません。
ベストアンサー1
編集: これは最新の TS バージョンで修正されました。OP の投稿に対する @Simon_Weaver のコメントを引用します:
注: これはその後修正されました (正確な TS バージョンは不明)。予想どおり、VS で次のエラーが発生します。
Index signatures are incompatible. Type '{ firstName: string; }' is not assignable to type 'IPerson'. Property 'lastName' is missing in type '{ firstName: string; }'.
どうやら、宣言時に初期データを渡すと、これは機能しないようです。これは TypeScript のバグだと思うので、プロジェクト サイトで報告する必要があります。
次のように、例を宣言と初期化に分割することで、型付き辞書を利用できます。
var persons: { [id: string] : IPerson; } = {};
persons["p1"] = { firstName: "F1", lastName: "L1" };
persons["p2"] = { firstName: "F2" }; // will result in an error