Przejdź do treści
webtype.orgwebtype.orgTS1107

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    TS1107

    Skok poza wywołanie zwrotne

    Jump target cannot cross function boundary.

    Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.

    `break` i `continue` sterują pętlą, w której je zapisano. Wywołanie zwrotne to inna funkcja i ta pętla nie należy do niej.

    Odtworzenie

    const ids = [1, 2, 3]
    const kept: number[] = []
    
    for (const id of ids) {
      ids.forEach(() => {
        if (id > 2) continue
      })
      kept.push(id)
    }

    Build potwierdza, że to emituje dokładnie ten kod.

    Dlaczego kompilator tak mówi

    `forEach` przyjmuje funkcję, a tę funkcję wywołuje `forEach`, nie pętla. `continue` oznacza skok do następnej iteracji otaczającej pętli, a wnętrza wywołania zwrotnego nie otacza nic poza wywołaniem. Kompilator odrzuca to już przy parsowaniu, zanim pozna jakiekolwiek typy, bo żaden układ typów nie nadałby temu skokowi sensu.

    Naprawy

    1. 01
      const ids = [1, 2, 3]
      const kept: number[] = []
      
      for (const id of ids) {
        if (id > 2) continue
        kept.push(id)
      }

      Użyj prawdziwej pętli. `for…of` daje `continue` cel skoku i czyta się jako iteracja, którą i tak już była.

    2. 02
      const ids = [1, 2, 3]
      const kept = ids.filter((id) => id <= 2)

      Albo przestań sterować i opisz wynik. Większość `continue` wewnątrz wywołania zwrotnego to filtr, którego nie zapisano jako filtr.

    Wniosek

    Wewnątrz wywołania zwrotnego jedynym wyjściem jest `return`. Jeśli chciałeś pominąć albo przerwać, właściwą odpowiedzią jest zwykle metoda tablicy, która znaczy „pomiń” lub „przerwij”.

    Błędy