scala-js Ошибка «@JSGlobalScope» при переходе на scala-js 1.1.1
У меня был следующий фрагмент кода в 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
объекта, который на самом деле не существует в глобальной области видимости, выдаст a 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)
}