在scala.js中围绕javascript对象的Typesafe包装器

时间:2015-05-29 20:52:13

标签: scala.js

我想在一个javascript库周围写一个scala.js包装器,它有一个可以实例化的对象:

new Point({x: 10, y: 12})

似乎很简单。 我想有一个坐标案例类和一个包装点。

case class Coord(x: Int, y: Int)
class Point(coord: Coord) extends js.Object

这显然不起作用,因为案例类没有被翻译成对象文字。我当然可以摆脱Coord案例类,而是将js.Dynamic.literal传递给构造函数,但这不是很安全的。

我还有其他选择吗?我是否必须编写一个更高级别的包装器来接受Coord并将其转换为对象文字,然后再将其传递给Point对象?

1 个答案:

答案 0 :(得分:4)

您有几个选择:

选项对象

trait Coords extends js.Object {
  def x: Int = js.native
  def y: Int = js.native
}

class Point(coords: Coords) extends js.Object

Coords的类型安全工厂。 this SO post

中的详细信息

Point Factory / Higher Level Wrapper

case class Coords(x: Int, y: Int)

object Point {
  def apply(coords: Coords): Point = new Point(
    js.Dynamic.literal(x = coords.x, y = coords.y))
}

将案例类解释为选项对象

trait PointCoords extends js.Object {
  def x: Int = js.native
  def y: Int = js.native
}

@JSExportAll
case class Coords(x: Int, y: Int)

val c = Coords(1, 2)
new Point(js.use(c).as[PointCoords])