簡體   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