Как создать экземпляр scala.scalajs.js.ThisFunction3 в этом примере, используя функцию данных org.singlespaced.d3js - PullRequest
0 голосов
/ 25 апреля 2018

У меня небольшая проблема с созданием 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 Ответ

0 голосов
/ 25 апреля 2018

js.ThisFunction2, который вы хотите получить, имеет тип Node|js.Array[Resource] для типа получателя. Следовательно, функция стрелка должна принимать аргумент этого определенного типа (или супертип , потому что типы аргументов противоречивы):

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

скомпилирует.

Конечно, это означает, что тело вашей функции должно обрабатывать Node s и js.Array[Resource] одинаково. Это то, что говорит тип функции, так что это ожидаемо: вызывающая функция может вызывать ее либо с помощью Node, либо js.Array[Resource], поэтому ваша функция должна иметь возможность обрабатывать и то, и другое.

...