[英]Upgrade object literal to proper class instance in ScalaJS?
scalajs是否具有将对象文字“升级”为类型的适当实例的机制?
举例说明:
给定一个简单的类型,如下所示:
import scala.scalajs.js
import scala.scalajs.js.annotation.JSExport
import scala.scalajs.js.annotation.ScalaJSDefined
@js.native
trait Point extends js.Object {
val x: Int = js.native
val y: Int = js.native
}
// or
@ScalaJSDefined @JSExport
class Point(val x: Int, val y: Int) extends js.Object
和一些使用它的功能:
import scala.scalajs.js.annotation.JSExport
@JSExport
object Foo {
@JSExport
def foo(point: Point) = ???
}
在javascript环境中,我希望能够“升级”等效的对象文字值以使其成为适当的Point
实例,因此以下行为是相同的:
var p1 = new Point(1, 1);
Foo.foo(p1);
var p2 = { x: 1, y: 1 };
Foo.foo(p2);
实现此目标的最佳方法是什么?
首先,假设您对Point
的第一个定义是
@js.native
trait Point extends js.Object {
val x: Int = js.native
val y: Int = js.native
}
对象文字{ x: 1, y: 1 }
已经是 Point
的有效实例。 使用Scala.js定义的JS特征而不是本机特征也更好:
@ScalaJSDefined
trait Point extends js.Object {
val x: Int
val y: Int
}
如果您使用Point
的其他定义,即
@ScalaJSDefined @JSExport
class Point(val x: Int, val y: Int) extends js.Object
那么最好的办法就是还定义了PointJS
从一个JS特质,以及隐式转换为/ Point
:
@ScalaJSDefined
trait PointJS extends js.Object {
val x: Int
val y: Int
}
object PointJS {
implicit def point2pointJS(p: Point): PointJS = new PointJS {
val x = p.x
val y = p.y
}
implicit def pointJS2point(p: PointJS): Point =
Point(p.x, p.y)
}
然后,你将需要一个JS友好的出口,它采用了PointJS
,而不是一个Point
:
@JSExport
object Foo {
@JSExport
def foo(point: Point) = ???
@JSExport
def foo(point: PointJS) = foo(point: Point)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.