Errore di scala-js “@JSGlobalScope” durante la migrazione a scala-js 1.1.1

Aug 20 2020

Ho avuto uno snippet di codice in 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
}

E stavo migrando il progetto per usare scala-js (1.1.1)

quando compilo lo stesso codice in scala-js (1.1.1), ricevo questo errore: -

const value = js1;
              ^

ReferenceError: js1 is not defined

Qualcuno può aiutarmi a ottenere la stessa funzionalità con scala-js (1.1.1)?

configurazione: -

scala -> 2.13.3, sbt -> 1.3.13, jvm -> 14

Risposte

2 sjrd Aug 20 2020 at 15:35

Come spiegano le note di rilascio di Scala.js 1.0.0 , il tentativo di leggere anche un membro di un @JSGlobalScopeoggetto che non esiste effettivamente nello scope globale genererà un ReferenceError, mentre Scala.js 0.6.x darebbe undefined.

La stessa sezione delle note di rilascio spiega che, se lo scopo è verificare se è definito, è ora necessario utilizzare un test esplicito con js.typeOf. Nel tuo esempio specifico:

object Main2 extends App {
  val js = for {
    jsTest <- JSTest.js1.toOption
  } yield jsTest

  println(JSTest.js1)
}

Ciò significherebbe che non puoi più accedere incondizionatamente a JSTest.js1quello. Devi prima assicurarti che esista usando un js.typeOftest:

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