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])
我想围绕 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])