Errore di scala-js “@JSGlobalScope” durante la migrazione a scala-js 1.1.1
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
Come spiegano le note di rilascio di Scala.js 1.0.0 , il tentativo di leggere anche un membro di un @JSGlobalScope
oggetto 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.js1
quello. Devi prima assicurarti che esista usando un js.typeOf
test:
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)
}