Error de scala-js “@JSGlobalScope” al migrar a scala-js 1.1.1

Aug 20 2020

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

2 sjrd Aug 20 2020 at 15:35

Como explican las notas de la versión de Scala.js 1.0.0 , intentar incluso leer un miembro de un @JSGlobalScopeobjeto 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.js1así. Primero debe asegurarse de que exista mediante una js.typeOfprueba:

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)
}