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

马库斯·约斯科(Markus Joschko)

我想围绕一个具有可实例化对象的javascript库编写一个scala.js包装器:

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

似乎很简单。我希望有一个坐标案例类和一个包装器。

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

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

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

gzm0

您有两种选择:

期权对象

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

class Point(coords: Coords) extends js.Object

和一个类型安全的工厂Coords该帖子的详细信息

点工厂/高级包装

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章