在JavaScript(因此TypeScript)中,屬性鍵被強制爲string
s。所以,如果你訪問屬性與number
鍵,你實際上訪問屬性與string
鍵:
var obj = {3: 'a', four: 'b'};
console.log(obj['3']); // a
console.log(obj[3]); // a
console.log(obj[3] === obj['3']); // true
但也有一些string
按鍵,是不是也number
鍵:
console.log(obj['four']); // b
因此,TypeScript編譯器強制返回值用於訪問number
密鑰是訪問string
密鑰的返回值的特例。例如,下面是好的:
interface Okay {
[x: string]: Animal;
[x: number]: Dog;
}
每次你訪問一個Okay
與number
鍵,你居然還用string
鍵訪問它。並且由於每個number
關鍵屬性是Dog
,並且每個string
關鍵屬性是Animal
,這就是說:每當您獲得Dog
時,您實際上也獲得了Animal
。這對編譯器來說是可驗證的。它知道Dog
是Animal
的子類,並且每個Dog
是Animal
。所以TypeScript很高興與Okay
。
但下面是不行的:
interface NotOkay {
[x: number]: Animal;
[x: string]: Dog;
}
每次你訪問一個NotOkay
與number
鍵,你居然還用string
鍵訪問它。並且由於每個number
關鍵屬性是一個Animal
,並且每個string
關鍵屬性是一個Dog
,這就是說:每當您得到一個Animal
時,您實際上也獲得一個Dog
。這是而不是對於編譯器是可驗證的;不是每個Animal
必然是Dog
,所以TypeScript是不高興與NotOkay
和抱怨。
希望有所幫助。
代碼。 HTML – Lulu