我創建了一個類,它有 2 個屬性存盤帶有數字的元組陣列。我還創建了一個方法“getIndex”,它動態訪問這些屬性,然后檢查是否存在包含相同數字的元組。該函式如下所示:
getIndex(posX: number, posY: number, pathArr: string) {
for (let routeCoordinates of this[pathArr]) {
if (routeCoordinates[0] === posX && routeCoordinates[1] === posY) {
return this[pathArr].indexOf(routeCoordinates);
}
}
}
問題是,每當我嘗試將 pathArr 作為鍵傳遞時,都會收到以下錯誤訊息:
“元素隱式具有'any'型別,因為'string'型別的運算式不能用于索引'PathfinderSecondStage'型別。在'PathfinderSecondStage'型別上找不到帶有'string'型別引數的索引簽名。”
我知道泛型,但我在互聯網上找到的解決方案不起作用,因為我正在處理一個類實體。有沒有保持型別檢查的解決方案?
uj5u.com熱心網友回復:
直接的解決方案非常簡單。您需要做的就是更改pathArr: string引數,pathArr: keyof PathfinderSecondStage該引數將導致 TypeScript 創建類中所有公共欄位/方法的聯合型別,然后提取 this[pathArr]陳述句并在型別斷言的幫助下將其分配給變數以告訴它確切將要使用的型別:
getIndex(posX: number, posY: number, pathArr: string) {
const myArray = this[pathArr] as number[][];
for (let routeCoordinates of myArray) {
if (routeCoordinates[0] === posX && routeCoordinates[1] === posY) {
return myArray.indexOf(routeCoordinates);
}
}
}
pathArr您還可以通過專門定義包含可以在函式中遍歷的陣列的欄位的名稱
來進一步縮小引數的允許變數,如下所示:getIndex(posX: number, posY: number, pathArr: 'fieldName1'|'fieldName2') {
這將縮小 TypeScript 創建聯合型別所需的型別數量,如果它們都是數字陣列 ( number[][]),則不需要執行第一個示例中顯示的型別斷言。
uj5u.com熱心網友回復:
如果沒有完整的代碼,就不可能知道this[]指的是什么,但是您可以通過將 Typescript 陣列宣告為let ARRAY: { [key: string]: DTYPE; } = {};其中 ARRAY 是您的陣列名稱而 DTYPE 是您要存盤的資料型別,從而允許使用字串對其進行索引。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/481036.html
標籤:javascript 打字稿 哎呀 类型
下一篇:如何正確鍵入此物件轉換?
