本例中如何使用 org.singlespaced.d3js 的数据函数实例化 scala.scalajs.js.ThisFunction3
How to instantiate scala.scalajs.js.ThisFunction3 in this example using org.singlespaced.d3js' data function
我在以下示例中实例化 scala.scalajs.js.ThisFunction3
时遇到一点问题(使用 org.singlespaced.d3js
)
val selection = myG.selectAll(".res")
.data[Resource]((r: Container, i: Int) => r.resources.toJSArray,
{(n: Node, r: Option[Resource], i:Int) => ""} // (*) this results in a type mismatch
: ThisFunction2[Node|js.Array[Resource],js.UndefOr[Resource], Int, String])
myG 是一个 Selection[Container]
并且 Container
有一个 List[Resource]
字段。
我尝试用以下代码替换标有 (*) 的行:
{(n: js.Array[Resource], r: js.UndefOr[Resource], i:Int) => ""}
{(n: List[Resource], r: Option[Resource], i:Int) => ""}
到目前为止,我尝试的所有操作都导致类型不匹配错误。任何帮助将不胜感激。
编辑:
数据函数的定义如下:
def data(): js.Array[Datum] = js.native
def data[NewDatum](data: js.Array[NewDatum]): Update[NewDatum] = js.native
def data[NewDatum](data: js.Array[NewDatum], key: js.ThisFunction2[dom.Node|js.Array[NewDatum],js.UndefOr[NewDatum], Int, String]): Update[NewDatum] = js.native
def data[NewDatum <: Datum](data: js.Array[NewDatum], key: js.Function2[Datum, Int, String]): Update[NewDatum] = js.native
def data[NewDatum](data: DatumFunction[js.Array[NewDatum]]): Update[NewDatum] = js.native
def data[NewDatum](data: DatumFunction[js.Array[NewDatum]], key: js.ThisFunction2[dom.Node|js.Array[NewDatum],js.UndefOr[NewDatum], Int, String]): Update[NewDatum] = js.native
您要获取的js.ThisFunction2
接收者类型为Node|js.Array[Resource]
。因此,箭头函数需要接受该特定类型的参数(或 超类型 ,因为参数类型是逆变的):
{(n: Node|js.Array[Resource], r: js.UndefOr[Resource], i:Int) => ""}
将编译。
当然,这意味着您的函数主体必须处理 Node
和 js.Array[Resource]
的相似之处。这就是函数类型所说的,所以它是预期的:该函数的调用者可以用 Node
或 js.Array[Resource]
调用它,所以你的函数必须能够处理这两种情况。
我在以下示例中实例化 scala.scalajs.js.ThisFunction3
时遇到一点问题(使用 org.singlespaced.d3js
)
val selection = myG.selectAll(".res")
.data[Resource]((r: Container, i: Int) => r.resources.toJSArray,
{(n: Node, r: Option[Resource], i:Int) => ""} // (*) this results in a type mismatch
: ThisFunction2[Node|js.Array[Resource],js.UndefOr[Resource], Int, String])
myG 是一个 Selection[Container]
并且 Container
有一个 List[Resource]
字段。
我尝试用以下代码替换标有 (*) 的行:
{(n: js.Array[Resource], r: js.UndefOr[Resource], i:Int) => ""}
{(n: List[Resource], r: Option[Resource], i:Int) => ""}
到目前为止,我尝试的所有操作都导致类型不匹配错误。任何帮助将不胜感激。
编辑:
数据函数的定义如下:
def data(): js.Array[Datum] = js.native
def data[NewDatum](data: js.Array[NewDatum]): Update[NewDatum] = js.native
def data[NewDatum](data: js.Array[NewDatum], key: js.ThisFunction2[dom.Node|js.Array[NewDatum],js.UndefOr[NewDatum], Int, String]): Update[NewDatum] = js.native
def data[NewDatum <: Datum](data: js.Array[NewDatum], key: js.Function2[Datum, Int, String]): Update[NewDatum] = js.native
def data[NewDatum](data: DatumFunction[js.Array[NewDatum]]): Update[NewDatum] = js.native
def data[NewDatum](data: DatumFunction[js.Array[NewDatum]], key: js.ThisFunction2[dom.Node|js.Array[NewDatum],js.UndefOr[NewDatum], Int, String]): Update[NewDatum] = js.native
您要获取的js.ThisFunction2
接收者类型为Node|js.Array[Resource]
。因此,箭头函数需要接受该特定类型的参数(或 超类型 ,因为参数类型是逆变的):
{(n: Node|js.Array[Resource], r: js.UndefOr[Resource], i:Int) => ""}
将编译。
当然,这意味着您的函数主体必须处理 Node
和 js.Array[Resource]
的相似之处。这就是函数类型所说的,所以它是预期的:该函数的调用者可以用 Node
或 js.Array[Resource]
调用它,所以你的函数必须能够处理这两种情况。