我想在一个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对象?
答案 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
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])