我正在編寫一個 TypeScript 函數,我的 IDE 告訴我,.shift() 的結果可能是未定義的,這會導致更多類型警告...
這是程式碼:
function accumulateProofs( proofs: Proof[], requiredAmount: Number, strategy: 'middle' | 'ascending' | 'descending', ): Proof[] { const result:Proof[] = []; const temp = proofs.slice(); let total = 0; switch (strategy) { case 'middle': { while (temp.length && total < desired) { const first = temp.shift(); total += first.amount; result.push(first); if (total >= desired) { break; } const last = temp.pop(); total += last; result.push(last); } } } return result }
現在我明白,當您無法確定數組中是否有任何元素時,此警告是有意義的,在這種情況下 .shift() 將返回未定義。但在這種情況下,我的 while 循環僅在 temp.length 為真時運行,在這種情況下我知道 temp.shift() 將返回一個值而不是未定義...我錯過了什麼嗎?
P粉6688042282024-02-04 09:33:31
shift
被定義為 Array
的通用方法,並具有以下簽名:
Array<T>.shift(): T |未定義
#因此,無論您的程式碼是否針對 temp.length
斷言,當您呼叫 shift
時,您都必須期望傳回類型:
T |未定義
#您只需新增一個預設值:
const first = temp.shift() || { amount: 0 }
對於 temp.pop()
也是如此。
這裡是ts-遊樂場