scala-js error "@JSGlobalScope" saat bermigrasi ke scala-js 1.1.1

Aug 20 2020

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

2 sjrd Aug 20 2020 at 15:35

Seperti yang dijelaskan oleh catatan rilis Scala.js 1.0.0 , mencoba membaca anggota @JSGlobalScopeobjek 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.js1lagi seperti itu. Anda harus terlebih dahulu memastikannya ada menggunakan js.typeOftes:

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