[英]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.