我正在编写一个 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() 将返回一个值而不是未定义...我错过了什么吗?
shift
被定义为Array
的通用方法,并具有以下签名:Array<T>.shift(): T |未定义
因此,无论您的代码是否针对
temp.length
断言,当您调用shift
时,您都必须期望返回类型:T |未定义
您只需添加一个默认值:
对于
temp.pop()
也是如此。这里是ts-游乐场