2016-09-20 54 views
1

我正在通過閱讀關於索引器類型的this official document來學習打字稿。打字稿「不是索引器的子類型」,這是什麼意思?

我無法理解這樣的代碼:你爲什麼把 '長度' 指數型內

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 

我不明白,在此行的註釋。爲什麼名稱必須是索引器的子類型?索引器就像是一個[10] =「Tom」,那麼索引器的子類型是什麼?

+1

代碼的目的是作爲一個壞榜樣之間的矛盾。所以,我想,'ok'註釋僅僅意味着從類型檢查器的角度來看它是可以的,而不是一般意義上的。 – artem

回答

2

我不明白這條評論。爲什麼名稱必須是索引器的子類型?

因爲對於任何string訪問打字稿將假定類型number(基於[index: string]: 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

該屬性可以通過索引器語法訪問,[「名稱」]將返回一個數字,而不是索引器類型簽名定義的字符串。 –