scala.js 中 javascript 对象的类型安全包装器

Typesafe wrapper around javascript object in scala.js

我想围绕 javascript 库编写一个 scala.js 包装器,它有一个可以像这样实例化的对象:

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

看起来很简单。 我想要一个坐标大小写 class 和一个围绕该点的包装器。

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

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

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

您有两个选择:

选项对象

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

中的详细信息

点工厂/更高级别的包装器

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))
}

将大小写 Class 解释为选项对象

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])