【问题标题】:Creating a scala.js facade with multiple possible return types创建具有多种可能返回类型的 scala.js 外观
【发布时间】:2017-06-28 05:44:36
【问题描述】:

我正在尝试为现有的 javascript 库创建一个 scala.js 外观。这一特定功能具有以下签名:

def something(command: String) = js.native

现在的问题是,在实际的 javascript 库中,此方法为一个命令值返回一个字符串,并为另一个命令值返回一个 JQuery。我不确定该方法的返回类型是什么。我正在考虑将其保留为 js.Any,然后用户必须使用 asInstanceOf 将其转换为相应的类型,但我认为它可以以更好的方式处理。

有什么建议吗?

【问题讨论】:

    标签: scala scala.js


    【解决方案1】:

    就我个人而言,我可能会将其包装为 Scala 中的多个强类型函数,围绕专用字符串进行包装。

    例如,请参阅我为 Querki 构建的 Manifest facade。它有一个只描述字面调用的内部外观:

    @js.native
    trait ManifestFacade extends js.Object {
      @JSName("manifest")
      def manifestInternal(cmd:String, params:js.Any*):Any = js.native
    }
    

    不过,这并不适合应用程序使用。相反,它有一个包装层,具有更精确的功能,例如:

    class ManifestCommands(manifest:ManifestFacade) {
      def manifestList():dom.Element = manifest.manifestInternal("list").asInstanceOf[dom.Element]
      def manifestGetOptions():js.Dictionary[js.Any] = manifest.manifestInternal("option").asInstanceOf[js.Dictionary[js.Any]]
      def manifestGetOption(name:String):Any = manifest.manifestInternal("option", name)
    }
    

    存在从ManifestFacadeManifestCommands 的隐式转换。 (这是旧代码;现在,我会将ManifestCommands 写为隐式类。)

    这是一些额外的前期工作,但这允许应用程序代码在良好的强类型级别上工作,而不必担心各种命令在后台调用疯狂多态函数的方式。

    【讨论】:

    • 哦,是的,我记得在你的另一个门面看到过这个。可惜我没有早点把它捡起来。但是,是的,这似乎好多了。正是我想要的。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2015-04-17
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多