【问题标题】:scala-js "@JSGlobalScope" error when migrating to scala-js 1.1.1迁移到 scala-js 1.1.1 时出现 scala-js“@JSGlobalScope”错误
【发布时间】:2020-08-20 23:35:57
【问题描述】:

我在 scala-js(0.6.33) 中有一段闲置的 sn-p 代码

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

【问题讨论】:

    标签: scala scala.js


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多