Scala-js jquery悬停类型错误

时间:2015-09-22 14:12:16

标签: scala.js

使用scalajs-jquery 0.8.0,根据以下导入假设:

import org.scalajs.jquery.{jQuery => $`, the following does not compile:
import dom.html.Element

以下代码无法编译,这是我的问题:

      $("").hover(((_this: Element, event: JQueryEventObject) => {
      }): js.ThisFunction)
type mismatch;
 found   : scala.scalajs.js.ThisFunction
 required: scala.scalajs.js.Function1[org.scalajs.jquery.JQueryEventObject,scala.scalajs.js.Any]

但以下编译。

  $("").click(((_this: Element, event: JQueryEventObject) => {
  }): js.ThisFunction)

由于click和hover方法具有相同的签名(因此应该应用相同的含义),为什么第一次调用不能编译而第二次调用呢?请参阅JQuery.scala

编辑:解决方法:我找到的解决方法是明确地转换函数,所以:

      $("").hover((((_this: Element, event: JQueryEventObject) => {
      }): js.ThisFunction).asInstanceOf[js.Function1[org.scalajs.jquery.JQueryEventObject,scala.scalajs.js.Any]])

1 个答案:

答案 0 :(得分:1)

调用click的原因是,还存在一个带有简单js.Any(名为eventData)的重载。对于hover,此重载不存在。

要获得适当的解决方案,需要做两件事恕我直言:

  1. 接受hover
  2. click(和js.ThisFunction1[Element, JQueryEventObject, js.Any])的重载
  3. 将您的类型归属更改为js.ThisFunction1[Element, JQueryEventObject, js.Any](在1.修复后将其删除)
  4. 让我给出一些更全面的解释:

    第一点:并非每个接受js.Function1[A, B]的方法都应接受js.ThisFunction1[T, A, B],因为它可能无法使用定义良好的this来调用给定的函数参考。我们无法确定T应该是什么的事实已经说明了这一点。

    因此,接受的外观会绑定this引用,应该有重载接受(正确键入的)js.ThisFunction

    第二点:您将js.Function2[Element, JQueryEventObject, js.Any]归于简单的js.ThisFunction。因此,编译器无法检查函数的实际参数的类型是否与其形式参数匹配。

    您必须归因于完整类型才能解决此问题。 AFIK,在Scala.js库中此时无法使用类型推理器句柄。但是,这可能是一个合理的功能请求。

    存在从scala.FunctionNjs.ThisFunction<N-1>的隐式转换,因此只要您需要的方法存在重载,就可以完全摆脱任何归属或转换。

    <强>解决方案: 目前,这使您无法使用解决方法,因为您需要在scalajs-jquery中进行外部更改。展望未来,您可以将更改请求/ PR打开到scalajs-jquery。