typescript .shift()的返回值可能是未定义的?

hec6srdp  于 2023-04-22  发布在  TypeScript
关注(0)|答案(1)|浏览(175)

我正在写一个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()将返回undefined。但是在这种情况下,我的while循环只在temp.length为true时运行,在这种情况下,我知道temp.shift()将返回一个值,而不是undefined...我错过了什么吗?

ppcbkaq5

ppcbkaq51#

shift被定义为Array的泛型方法,并具有以下签名:
Array<T>.shift(): T | undefined
所以不管你的代码是否针对temp.lengthAssert,当你调用shift时,你必须期待返回类型:
T | undefined
你只需要添加一个默认值:

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

并且对于temp.pop()也是如此。
这里是一个链接到ts-playground

相关问题