Ist es möglich, dass .shift() undefiniert zurückgibt?
P粉461599845
P粉461599845 2024-02-03 19:55:25
0
1
355

Ich schreibe eine TypeScript-Funktion und meine IDE sagt mir, dass das Ergebnis von .shift() möglicherweise undefiniert ist, was zu mehr Typwarnungen führt ...

Das ist der Code:

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
}

Jetzt verstehe ich, dass diese Warnung sinnvoll ist, wenn Sie nicht sicher sein können, ob das Array Elemente enthält. In diesem Fall gibt .shift() undefiniert zurück. Aber in diesem Fall läuft meine while-Schleife nur, wenn temp.length wahr ist. In diesem Fall weiß ich, dass temp.shift() einen Wert anstelle von undefiniert zurückgibt ... übersehe ich etwas?

P粉461599845
P粉461599845

Antworte allen(1)
P粉668804228

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

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

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

T |未定义

您只需添加一个默认值:

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

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

这里是ts-游乐场

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage