scala-js “@JSGlobalScope” error when migrating to scala-js 1.1.1

核能气质少年 提交于 2020-08-26 07:18:08

问题


I had a fallowing snippet of code 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
}

And I was migrating the project to use scala-js(1.1.1)

when I compile the same code in scala-js(1.1.1), I am getting this error: -

const value = js1;
              ^

ReferenceError: js1 is not defined

Can anyone help me achieve the same functionality with scala-js(1.1.1)?

configuration: -

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


回答1:


As the release notes of Scala.js 1.0.0 explain, trying to even read a member of an @JSGlobalScope object that does not actually exist in the global scope will throw a ReferenceError, whereas Scala.js 0.6.x would give undefined.

The same section of the release notes explains that, if the purpose is to check whether it is defined, it is now necessary to use an explicit test with js.typeOf. In your specific example:

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

  println(JSTest.js1)
}

That would mean that you can't unconditionally access JSTest.js1 like that anymore. You first have to make sure it exists using a 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)
}


来源:https://stackoverflow.com/questions/63507979/scala-js-jsglobalscope-error-when-migrating-to-scala-js-1-1-1

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!