[英]What does this type declaration mean in Typescript?
我是Typescript的新手,我正在閱讀其他人的代碼並且在使用此聲明時遇到問題:
private somevar: { [s: string]: string };
這是什么類型的? 方括號表示一個數組,但我對這究竟是什么形狀感到困惑。
它是一種可索引類型。 查看此變量定義的類型表達式:
let myIndexVar: { [key: string]: number; };
: { ... }
表示它是一個對象。 [key: string]: number;
是對象的索引簽名。 在索引簽名內:
[key: string]
定義key
- 鍵的名稱 - 以及key
- string
的類型。 : number;
是值number
的類型。 這些類型的使用方式如下:
let myIndexVar: { [key: string]: number; } = {};
myIndexVar["key"] = 4; // key is string, value is number
請注意,您可以為密鑰指定任何您喜歡的名稱。 給它一個描述性名稱有助於說出密鑰是什么,盡管變量名也應該這樣做:
為了進一步解釋David Sherret的回答
可索引類型與我們如何使用接口來描述函數類型類似,我們也可以描述我們可以“索引到”的類型,如[10]或ageMap [“daniel”]。 可索引類型具有索引簽名,該簽名描述了我們可以用來索引對象的類型,以及索引時相應的返回類型。 我們來舉個例子:
interface StringArray { [index: number]: string; } let myArray: StringArray; myArray = ["Bob", "Fred"]; let myStr: string = myArray[0];
上面,我們有一個具有索引簽名的StringArray接口。 此索引簽名表明當StringArray使用數字編制索引時,它將返回一個字符串。
支持的索引簽名有兩種類型:字符串和數字。 可以支持兩種類型的索引器,但從數字索引器返回的類型必須是從字符串索引器返回的類型的子類型。 這是因為當使用數字進行索引時,JavaScript實際上會在索引到對象之前將其轉換為字符串。 這意味着使用100(數字)索引與使用“100”(字符串)進行索引相同,因此兩者需要保持一致。
class Animal { name: string; } class Dog extends Animal { breed: string; } // Error: indexing with a 'string' will sometimes get you a Dog! interface NotOkay { [x: number]: Animal; [x: string]: Dog; }
雖然字符串索引簽名是描述“字典”模式的有效方式,但它們還強制所有屬性都與其返回類型匹配。 這是因為字符串索引聲明obj.property也可用作obj [“property”]。 在以下示例中,name的類型與字符串索引的類型不匹配,type-checker給出錯誤:
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 }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.