scala-js Ошибка «@JSGlobalScope» при переходе на scala-js 1.1.1

Aug 20 2020

У меня был следующий фрагмент кода в 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

Ответы

2 sjrd Aug 20 2020 at 15:35

Как объясняется в примечаниях к выпуску 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)
}