[英]typescript: access property with dot notation using 'dictionary' type
嘗試使用點表示法訪問dict的屬性會使Typescript抱怨。 語言規范4.10規定:
ObjExpr [IndexExpr]
...如果ObjExpr的表觀類型具有字符串索引簽名且IndexExpr的類型為Any,String或Number原始類型或枚舉類型,則屬性訪問屬於該索引簽名的類型。
我在用:
interface MapStringToFunction {
[index: string]: Function;
}
var dict: MapStringToFunction = {};
dict.say = () => 'hi';
dict.say();
MapStringToFunction有一個sting索引簽名,並且say
是String類型,所以應該允許它? 但顯而易見的不是。 我的錯誤是什么?如何更改代碼以便我可以使用點表示法鍵入dict和訪問屬性?
對於:
屬性訪問屬於該索引簽名的類型
在這種情況下,屬性訪問是括號表示法:
interface MapStringToFunction {
[index: string]: Function;
}
var dict: MapStringToFunction = {};
dict['say'] = () => 'hi';
dict['say']();
以下是編譯時錯誤:
interface MapStringToFunction {
[index: string]: Function;
say: number; // Eroor
}
在我們的例子中,Function是唯一允許的屬性類型:
interface MapStringToFunction {
[index: string]: Function;
say: Function;
}
但是,為了能夠使用任何屬性,必須聲明它
否則會打開太多類型不安全的訪問。 例如, 如果您建議允許以下內容,則只會在運行時失敗而不是編譯時間 :
interface MapStringToFunction {
[index: string]: Function;
}
var dict: MapStringToFunction = {};
dict.say() // Runtime error, as undefined is not callable
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.