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) ได้เหมือนกัน
การกำหนดค่า: -
สกาล่า -> 2.13.3, SBT -> 1.3.13, JVM -> 14
คำตอบ
ในฐานะที่เป็นบันทึกการเปิดตัวของ 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)
}