Scala.js:带有javascript参数的导出类构造函数

时间:2016-08-02 08:33:37

标签: scala scala.js

学习scala.js并尝试将scala.js类导出为这样的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作为参数。

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

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

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

然后在javascript控制台(Chrome)中,我甚至找不到构造函数。它抛出" ReferenceError:Pt未定义"

1 个答案:

答案 0 :(得分:3)

您有几个选择:

到处使用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)