代码之家  ›  专栏  ›  技术社区  ›  Florian Baierl

如何实例化scala。scalajs。js。本例中的ThisFunction3使用org。单间距。d3js的数据函数

  •  0
  • Florian Baierl  · 技术社区  · 8 年前

    我在实例化 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
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   sjrd    8 年前

    这个 js.ThisFunction2 您要获取的具有 Node|js.Array[Resource] 对于接收器类型。因此,arrow函数需要接受该特定类型的参数(或 超类型 ,因为参数类型是逆变的):

    {(n: Node|js.Array[Resource], r: js.UndefOr[Resource], i:Int) => ""}
    

    将编译。

    当然,这意味着函数体必须处理 Node s和 js.Array[Resource] 同样地这就是函数类型所说的,所以我们期望:该函数的调用方可以使用 节点 或a js。数组[资源] ,因此您的函数必须能够处理这两者。