Scala.js:将带参数的 class 构造函数导出到 javascript

Scala.js: export class constructor with parameters to javascript

学习 scala.js 并尝试将 scala.js class 导出到 javascript,如下所示:

@JSExport("Pt")
class Pt[T]( points: Seq[T] ) {

    @JSExport
    def y = points(1)
}

当我在 javascript 控制台 (Chrome) 中尝试此操作时:

new Pt([1,2,3])

以上抛出错误:"$c_sjsr_UndefinedBehaviorError ... 1,2,3 不是 scala.collection.immutable.Seq" 的实例。不确定如何在 javascript.

中传递 Seq 作为参数

创建带参数的 class 构造函数的技巧是什么,以便它既可以用作 javascript 库又可以用作 Scala 库?我必须使用 js.Array 吗? (如果可能的话更喜欢不可变的集合)

我尝试了@JSExportAll,但它也不起作用:

@JSExportAll
class Pt[T]( points: Seq[T] ) {
    def y = points(1)
}

然后在javascript控制台(Chrome),我什至找不到构造函数。它抛出 "ReferenceError: Pt is not defined"

您有两个选择:

到处使用js.Array

@JSExport
class Pt[T](points: js.Array[T]) {
  def y = points(1)
}

// Scala
val pt = new Pt(js.Array(1,2,3))

// JS
var pt = new Pt([1,2,3])

创建一个带有 js.Array

的辅助构造函数
class Pt[T](points: Seq[T]) {
  @JSExport
  def this(points: js.Array[T]) = this(points.toSeq)

  def y = points(1)
}

// Scala
val pt = new Pt(Seq(1,2,3))

// JS
var pt = new Pt([1,2,3])

在构造函数中取一个变量参数列表

@JSExport
class Pt[T](points: T*) {
  def y = points(1)
}

// Scala
val pt1 = new Pt(1,2,3)
val pt2 = new Pt(seq: _*)

// JS
var pt = new Pt(1,2,3)