使用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]])
答案 0 :(得分:1)
调用click
的原因是,还存在一个带有简单js.Any
(名为eventData
)的重载。对于hover
,此重载不存在。
要获得适当的解决方案,需要做两件事恕我直言:
hover
click
(和js.ThisFunction1[Element, JQueryEventObject, js.Any]
)的重载
js.ThisFunction1[Element, JQueryEventObject, js.Any]
(在1.修复后将其删除)让我给出一些更全面的解释:
第一点:并非每个接受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.FunctionN
到js.ThisFunction<N-1>
的隐式转换,因此只要您需要的方法存在重载,就可以完全摆脱任何归属或转换。
<强>解决方案:强> 目前,这使您无法使用解决方法,因为您需要在scalajs-jquery中进行外部更改。展望未来,您可以将更改请求/ PR打开到scalajs-jquery。