scala-js1.1.1に移行する際のscala-js「@JSGlobalScope」エラー

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)で同じ機能を実現するのを手伝ってもらえますか?

構成:-

スカラ- > 2.13.3、SBT - > 1.3.13、JVM - > 14

回答

2 sjrd Aug 20 2020 at 15:35

以下のようScala.js 1.0.0のリリースノートを説明し、さえのメンバー読み取ろうと@JSGlobalScopeスローされます実際にグローバルスコープに存在しないオブジェクトをReferenceErrorScala.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)
}