scala-js error "@JSGlobalScope" saat bermigrasi ke scala-js 1.1.1
Saya memiliki potongan kode bera di 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
}
Dan saya memigrasi proyek untuk menggunakan scala-js (1.1.1)
ketika saya mengkompilasi kode yang sama di scala-js (1.1.1), saya mendapatkan kesalahan ini: -
const value = js1;
^
ReferenceError: js1 is not defined
Adakah yang bisa membantu saya mencapai fungsi yang sama dengan scala-js (1.1.1)?
konfigurasi: -
scala -> 2.13.3, sbt -> 1.3.13, jvm -> 14
Jawaban
Seperti yang dijelaskan oleh catatan rilis Scala.js 1.0.0 , mencoba membaca anggota @JSGlobalScope
objek yang sebenarnya tidak ada dalam cakupan global akan menampilkan a ReferenceError
, sedangkan Scala.js 0.6.x akan memberikan undefined
.
Bagian yang sama dari catatan rilis menjelaskan bahwa, jika tujuannya adalah untuk memeriksa apakah sudah ditentukan, sekarang perlu menggunakan pengujian eksplisit dengan js.typeOf
. Dalam contoh spesifik Anda:
object Main2 extends App {
val js = for {
jsTest <- JSTest.js1.toOption
} yield jsTest
println(JSTest.js1)
}
Itu berarti Anda tidak dapat mengakses tanpa syarat JSTest.js1
lagi seperti itu. Anda harus terlebih dahulu memastikannya ada menggunakan js.typeOf
tes:
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)
}