Typescriptで辞書を宣言して初期化する 質問する

Typescriptで辞書を宣言して初期化する 質問する

次のコード

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

おすすめ記事