如何解决迁移到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)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。