在ScalaJS中将对象文字升级到正确的类实例?

时间:2017-01-14 21:37:20

标签: javascript scala scala.js

是否有机制将对象文字“升级”为适当的类型实例?

举例说明:

给定一个类似的简单类型:

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) = ???
}

实现这一目标的最佳方法是什么?

1 个答案:

答案 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)
}