ありがとうございます!リンク先も参考になりました!すいません、確認なのですが、どんなキーを幾つ持っていてもOKなオブジェクトを宣言する場合は以下の書き方であってますか? let dic: {};
ID:.fcdrE
すいません、TypeScripお詳しそうなので、もう1点だけ気になっていたことをお聞きしたいのですが、以下のコードがエラーになるのは何故なのですか? (エラー:Property ’name’ does not exist on type ’{}’.) let dic: {} = {name: "w3q"}; console.log(dic.name); 「dic.name」ではなく「dic["name"]」で参照するとコンパイルは通るのですが、なぜ、「dic.name」はダメなのですか?
ID:25a.CW
>どんなキーを持っていてもOK 次のように宣言します。
let dic: { [key:string]: string; };
"[key: string]"は「インデックスシグネチャ」でググると詳しくわかると思います。
>エラーになるのは何故なのですか?
let dic:{}; と宣言すると、「何のプロパティも持たないオブジェクトリテラル型」として宣言された扱いになるので型チェックでエラーになります。 後から自由に拡張可能なオブジェクト(連想配列とか)を作る場合は、インデックスシグネチャでプロパティを宣言しておく必要がありますね。
みんなの回答 1 件
オブジェクトリテラル型、もしくはinterfaceを使います。
let o:{
key1: number;
key2: string;
} = { key1: 123, key2: "valueStr" };
確かに公式のhandbookだとinterfaceの説明の中でサラッとしか書かれてないですね。名前の付いたオブジェクトリテラル型=interfaceなのでまとめられているようです。
なお、ES2015の動く環境向けにコンパイルするならMap,Set,WeakMap,WeakSetも連想配列として使えます。これらは通常の型宣言で特別な書き方は必要ありません。
TypeScript プログラミング - オブジェクト型 - オブジェクト型リテラル
http://docs.solab.jp/typescript/object/typeliteral/関連するトピックス