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) ได้เหมือนกัน

การกำหนดค่า: -

สกาล่า -> 2.13.3, SBT -> 1.3.13, JVM -> 14

คำตอบ

2 sjrd Aug 20 2020 at 15:35

ในฐานะที่เป็นบันทึกการเปิดตัวของ 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)
}