繁体   English   中英

将对象文字升级到ScalaJS中的适当类实例?

[英]Upgrade object literal to proper class instance in 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM