【问题标题】:Scala-js jquery hover type errorScala-js jquery悬停类型错误
【发布时间】:2015-09-23 00:43:32
【问题描述】:

使用 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]])

【问题讨论】:

    标签: scala.js


    【解决方案1】:

    click 的调用起作用的原因是,还存在采用简单js.Any(命名为eventData)的重载。对于hover,此重载不存在。

    对于正确的解决方案,恕我直言,需要两件事:

    1. 接受js.ThisFunction1[Element, JQueryEventObject, js.Any]hover(和click)的重载
    2. 将您的类型归属更改为 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.FunctionNjs.ThisFunction<N-1> 的隐式转换,因此只要您需要的方法存在重载,您就可以完全摆脱任何归属或强制转换。

    解决方案: 目前,这让您无法解决问题,因为您需要对 scalajs-jquery 进行外部更改。展望未来,您可以向 scalajs-jquery 打开更改请求/PR。

    【讨论】:

    • 只是一个旁注:jquery-facade,更强的类型,通常不需要任何类型归属——因为它没有所有那些 js.Any,编译器可以通常正确推断函数类型。这不如 scala-js-jquery 完整,但如果你想探索这条路线,我很乐意添加悬停功能......
    猜你喜欢
    • 2014-04-15
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2011-04-20
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多