Saltar al contenido
webtype.orgwebtype.orgTS1107

    ↑↓ mover · ⏎ abrir · esc cerrar

    TS1107

    Saltar fuera de una retrollamada

    Jump target cannot cross function boundary.

    Las palabras del propio compilador. Sin traducir — es la cadena que pegaste en el buscador.

    `break` y `continue` dirigen el bucle en el que están escritos. Una retrollamada es otra función, y ese bucle no es suyo.

    Reproducción

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

    La compilación afirma que esto emite exactamente este código.

    Por qué lo dice el compilador

    `forEach` recibe una función, y a esa función la llama `forEach`, no el bucle. `continue` nombra un salto a la siguiente iteración de un bucle envolvente, y desde dentro de la retrollamada no la envuelve nada salvo una llamada. El compilador lo rechaza al analizar la sintaxis, antes de conocer ningún tipo, porque ninguna disposición de tipos daría sentido al salto.

    Arreglos

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

      Usa un bucle de verdad. `for…of` le da a `continue` un destino, y se lee como la iteración que ya era.

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

      O deja de dirigir y describe el resultado. Casi todo `continue` dentro de una retrollamada es un filtro que no se ha escrito como tal.

    Conclusión

    Dentro de una retrollamada la única salida es `return`. Si querías saltar o parar, el método de array que significa «saltar» o «parar» suele ser la respuesta real.

    Errores