scala - 迁移到 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
解决方案
正如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)
}
推荐阅读
- cuda - SASS指令的组合格式
- bash - 用于执行文件列表命令的脚本
- java - JVM 仅使用服务器上一半的内核
- python - 部分单词搜索在使用 mongo-connector 的弹性搜索(elasticsearch-py)中不起作用
- svn - 恢复 svn repo 的 hotcopy
- php - 允许 is_request 1 的用户不登录
- python - 如何检查一个键是否在 django 模板的字典中?
- javascript - 多个 OR 怎么做 || 在 JavaScript 中工作?
- python - 如何制作一个同时包含 Python 和 Haskell 包的 Nix 包?
- android - 如何更改 Recyclerview 中其他项目中按钮的可见性?