Object
は、他のJavaScriptオブジェクトへの参照を保持し、文字列でアクセスできます。.toString
を事前に呼び出し、その文字列を得ます。これは以下の通りです:obj
が使われるたびにtoString
が呼び出されることに注意してください。number
型のインデックスを使うと、JavaScript VMは、最適化を試みます(それが実際に配列であるか、格納された要素の構造がすべて一致しているかといったことに依存します)。なのでnumber
はそれ自身、string
とは別の、正しいオブジェクトアクセサとみなされるべきです。以下は単純な配列の例です:toString
を呼び出します。そのため、TypeScriptは、初心者が落とし穴にはまるのを防ぐために、エラーを出します(私はいつもstackoverflowで落とし穴にはまるJavaScriptユーザーをたくさん見ています):toString
を使うことを強制する理由は、オブジェクトのデフォルトのtoString
実装がかなりひどいためです。v8では常に[object Object]
を返します:number
はサポートされています。理由は以下の通りです。obj
としてそれを使うとしても、デフォルトのtoString
実装はまともです([object Object]
ではありません)。TypeScriptのインデックスシグネチャはstring
またはnumber
のいずれかでなければなりません。
symbols
もまたTypeScriptでサポートされています。しかし、まだそこには行かないでください。小さな一歩からです。any
を使ってきました。私たちは、実際にはインデックスシグネチャを明示的に指定できます。例えば文字列を使ってオブジェクトに格納されているものが構造体{message: string}
に従っていることを確認したいとします。これは{ [index:string] : {message: string} }
の宣言で行うことができます。これは以下のとおりです:ヒント: インデックスシグネチャの名前{ [index:string] : {message: string} }
のindex
はTypeScriptにとっては意味がなく、可読性のためだけのものです。例えばもしそれがユーザー名であれば、コードを見る次の開発者のために{ [username:string] : {message: string} }
と宣言することができます。
number
インデックスもサポートされています。例:{ [count: number] : SomeOtherTypeYouWantToStoreEgRebate }
string
インデックスシグネチャに従わなければならないstring
インデックスシグネチャを持つと、それと同時に、すべての明示的なメンバもそのインデックスシグネチャに準拠している必要があります。これを以下に示します:string
とnumber
インデクサの両方を持つstring
インデクサはnumber
インデクサよりも厳格であるという制約があります。これは意図的なものです。次のようなコードを可能にします:インデックスシグネチャを追加する際のAPIの考慮事項
nest
(またはchildren
や subnodes
など)のような名前で宣言します: