[英]typescript: declare type of map-like object
我正在使用 object 來存儲 map,鍵是字符串,值具有固定類型 T。
在 object 中查找鍵時,類型推斷為其分配類型 T。但它可能未定義。
在以下示例中,我希望 entry 的類型number|undefined
。 但 typescript 推斷number
。 這似乎不正確:
const data: {[index:string]: number} = {
"aa34da": 1,
"basd23": 2,
"as34sf": 5
};
const entry = data["doesn't exist"];
console.log(entry);
這是類型推斷中的錯誤嗎?
我知道 ES6 Map,它提供了一個完全符合我期望的簽名的get()
方法。 但是 Map 與 JSON 序列化並不能很好地配合。 我寧願只使用對象。
正如您已經發現的那樣,類型推斷沒有錯誤,因為data
的類型被明確設置為“在任何字符串鍵處包含數字的對象”。 所以我們應該讓 typescript 知道值可能是undefined
的:
declare const data: { [index: string]: number|undefined };
您還可以使用Record實用程序來定義這樣的類型:
declare const data: Record<string, number | undefined>;
Record<K, T>
構造一個具有一組 T 類型的屬性 K 的類型。
在玩了一些代碼之后,我認為聲明類似地圖的 object 的正確方法是,其中一些鍵可能不指向值:
const data: {[index:string]: number|undefined} = {
"aa34da": 1,
"basd23": 2,
"as34sf": 5
}
const entry = data["doesn't exist"];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.