.shift() 是否有可能返回未定义?
P粉461599845
P粉461599845 2024-02-03 19:55:25
0
1
356

我正在编写一个 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粉461599845
P粉461599845

全部回复(1)
P粉668804228

shift 被定义为 Array 的通用方法,并具有以下签名:

Array<T>.shift(): T |未定义

因此,无论您的代码是否针对 temp.length 断言,当您调用 shift 时,您都必须期望返回类型:

T |未定义

您只需添加一个默认值:

const first = temp.shift() || { amount: 0 }

对于 temp.pop() 也是如此。

这里是ts-游乐场

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板