2016-09-20 10 views
1

私はTypescriptについてthis official documentを読んでTypescriptを学習しています。typescript "インデクサーのサブタイプではありません"とはどういう意味ですか?

私はこのコードを理解することはできません:あなたはインデックス型の内側に '長さ' を入れない理由

interface NumberDictionary { 
    [index: string]: number; 
    length: number; // ok, length is a number 
    name: string;  // error, the type of 'name' is not a subtype of the indexer 
} 

まずを、???

let myDict : NumberDictionary; 
myDict[10] = 23; 

NumberDictionaryはインデックスタイプです。 NumberDictionary定義に長さがあるのはなぜですか?インデックス型は[10]、長さがあるのはなぜですか? javascriptの配列オブジェクトには長さがありますが、配列のインデックス型ですか?その場合、上記の例で長さを定義する理由は何ですか?それは必要ですか? 申し訳ありませんが私の暴言。あなたは私が非常に混乱しているのを見ることができます。

第二に、

name: string;// error, the type of 'name' is not a subtype of the indexer 

私は、この行のコメントを理解していません。なぜnameはインデクサのサブタイプでなければならないのですか?インデクサーは[10] = "Tom"のようなものですが、インデクサーのサブタイプは何ですか?

+1

間の矛盾を参照してください。だから、私は 'ok'というコメントは、型チェッカーの観点からは大丈夫だということを意味しているだけで、一般的には意味がありません。 – artem

答えて

2

この行のコメントはわかりません。なぜnameはインデクサのサブタイプでなければならないのですか?

任意のstringアクセス活字体は、([index: string]: number;に基づく)タイプnumberを前提となりますためので。 name: string;が許可されたのであれば、次はnumberを想定してだろうが、本当にあなたは文字列と思うかもしれない:

let x: NamedDictionary = Object.create(null); 
let n = "name"; 
let y = x[n]; // TypeScript assumes `number` 
let z = x["name"]; // Would you want `string`? 

をそのコードの目的は、悪い例として機能するyz^

+0

プロパティはインデクサ構文でアクセスできますが、["name"]はインデクサ型シグニチャで定義された文字列ではなく数値を返します。 –

関連する問題