scala-js 1.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)
}