簡體   English   中英

typescript:使用'字典'類型的點符號訪問屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM