scalajs是否有机制将对象文字“升级”为适当的类型实例?
举例说明:
给定一个类似的简单类型:
compile 'com.google.android.gms:play-services-maps:10.0.1'
和一些使用它的功能:
buil.gradle
在javascript环境中,我希望能够将等效的对象文字值“升级”为正确的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) = ???
}
实现这一目标的最佳方法是什么?
答案 0 :(得分:0)
首先,假设您的第一个定义为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
那么最好的方法是还定义一个JS特征的PointJS
,以及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)
}