搜索

首页  >  问答  >  正文

.shift() 是否有可能返回未定义?

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

全部回复(1)我来回复

  • P粉668804228

    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-游乐场

    回复
    0
  • 取消回复