Error de scala-js “@JSGlobalScope” al migrar a scala-js 1.1.1
Tenía un fragmento de código en reposo en scala-js (0.6.33)
object Main2 extends App {
val js = for {
jsTest <- JSTest.js1.toOption
} yield jsTest
println(JSTest.js1)
}
import scala.scalajs.js
import scala.scalajs.js.annotation.JSGlobalScope
@js.native
@JSGlobalScope
object JSTest extends js.Object {
def js1: js.UndefOr[JS2] = js.native
}
@js.native
trait JS1 extends js.Object {
def js1: js.UndefOr[JS2] = js.native
}
@js.native
trait JS2 extends js.Object {
def js2: js.UndefOr[Int] = js.native
}
Y estaba migrando el proyecto para usar scala-js (1.1.1)
cuando compilo el mismo código en scala-js (1.1.1), obtengo este error: -
const value = js1;
^
ReferenceError: js1 is not defined
¿Alguien puede ayudarme a lograr la misma funcionalidad con scala-js (1.1.1)?
configuración: -
scala -> 2.13.3, sbt -> 1.3.13, jvm -> 14
Respuestas
Como explican las notas de la versión de Scala.js 1.0.0 , intentar incluso leer un miembro de un @JSGlobalScope
objeto que en realidad no existe en el ámbito global arrojará un ReferenceError
, mientras que Scala.js 0.6.x daría undefined
.
La misma sección de las notas de la versión explica que, si el propósito es verificar si está definido, ahora es necesario usar una prueba explícita con js.typeOf
. En su ejemplo específico:
object Main2 extends App {
val js = for {
jsTest <- JSTest.js1.toOption
} yield jsTest
println(JSTest.js1)
}
Eso significaría que ya no puede acceder incondicionalmente JSTest.js1
así. Primero debe asegurarse de que exista mediante una js.typeOf
prueba:
object Main2 extends App {
val safeJS1 =
if (js.typeOf(JSTest.js1) == "undefined") None
else JSTest.js1.toOption
val js = for {
jsTest <- safeJS1
} yield jsTest
println(safeJS1)
}