迁移到scala-js 1.1.1时,scala-js“ @JSGlobalScope”错误

问题描述

我在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
}

我正在迁移项目以使用scala-js(1.1.1)

当我在scala-js(1.1.1)中编译相同的代码时,出现此错误:-

const value = js1;
              ^

ReferenceError: js1 is not defined

有人可以通过scala-js(1.1.1)帮助我实现相同的功能吗?

配置:-

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

解决方法

正如the release notes of Scala.js 1.0.0所解释的,即使试图读取实际上不在全局范围内的@JSGlobalScope对象的成员,也会抛出ReferenceError,而Scala.js 0.6.x会给undefined

发行说明的同一部分解释说,如果要检查是否已定义,则现在必须对js.typeOf使用显式测试。在您的特定示例中:

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

  println(JSTest.js1)
}

这意味着您不能再无条件地访问JSTest.js1。您首先必须使用js.typeOf测试来确保它存在:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...