-
ID:3dI3/c さんの質問

typescriptで辞書型(連想配列)を宣言する時ってどのように書くのですか?

ドキュメントに書いてないですよね。

みんなの回答 1 件

ID:25a.CW さんの回答

オブジェクトリテラル型、もしくは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/
ID:3dI3/c

ありがとうございます!リンク先も参考になりました!すいません、確認なのですが、どんなキーを幾つ持っていても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:{}; と宣言すると、「何のプロパティも持たないオブジェクトリテラル型」として宣言された扱いになるので型チェックでエラーになります。
後から自由に拡張可能なオブジェクト(連想配列とか)を作る場合は、インデックスシグネチャでプロパティを宣言しておく必要がありますね。

dic["name"]のインデックスアクセスでエラーが出ないのは裏技的な仕様ですね。この方法だと通常のドットアクセスとは異なり、現状、型チェックやアクセス制限のチェックが行われません。TSだと、privateメソッドに対して外部からtestを書きたい、みたいな時にあえて使ったりします。

ID:3dI3/c

ありがとうございます!インデックスシグネチャでググってみます!参考になりましたー!!!

最終更新日:2016-04-02 (10,430 views)

関連するトピックス

ページ上部に戻る