我正在學習,所以我有下一個代碼......
const numbers = {
one: "1",
two: "2",
three: "3"
}
const arr= ["one","one","two","one","three"]
arr.map((each)=>numbers[each])
如果我這樣做,numbers["one"]我會得到“1”,但它不適用于陣列,對于前面的代碼,我得到:
元素隱式具有“任何”型別,因為“字串”型別的運算式不能用于索引型別。
我想使用字典中的字串陣列作為鍵,但我不知道該怎么做。
謝謝你的幫助。
我發現解決方案剛剛添加到我的代碼中: Record<string, any>
uj5u.com熱心網友回復:
在您的評論中,您注意到您收到以下錯誤訊息
“元素隱式具有‘任何’型別,因為‘字串’型別的運算式不能用于索引型別”
由于陣列的型別,each鍵入為string. 這意味著“任何可能的字串值”。所以它可以是“一個”或“兩個”,但也可以是“”或“BorisJohnson”或“Fish”。
這帶來了一個問題,因為您已經使用該值來索引一個物件文字,該文字只有“一”、“二”或“三”鍵。
有兩種方法可以處理這個問題,第一種是給你的原始物件字面量一個索引簽名
const numbers: { [key: string]: string} = {
one: "1",
two: "2",
three: "3"
}
const arr = ["one", "one", "two", "one", "three"]
arr.map((each) => numbers[each])
但是,這是有問題的,因為在您的陣列包含不在物件中的值的情況下,從您的地圖回傳的陣列將被鍵入string[],而實際上它應該是(string | undefined)[](因為undefined當您使用鍵索引物件時得到的實際上并未包含在物件中)。
我首選的解決方案是為您的陣列提供更嚴格的型別:
const numbers = {
one: "1",
two: "2",
three: "3"
}
const arr: (keyof typeof numbers)[] = ["one", "one", "two", "one", "three"]
arr.map((each) => numbers[each])
這是一種更聰明的方法,因為如果您嘗試將原本不是物件鍵的內容放入該陣列中,編譯器將拋出錯誤。由于此編譯器錯誤,您的each變數現在保證是 的鍵之一numbers,因此將鍵入"one" | "two" | "three"。
numbers因此,每當您使用其中一個鍵進行索引時,您只會得到一個字串,因此您的陣列將被正確輸入,這是有道理的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/438466.html
