创建具有多种可能的 return 类型的 scala.js 门面

Creating a scala.js facade with multiple possible return types

我正在尝试为现有的 javascript 库创建一个 scala.js 门面。这一特定函数具有以下签名:

def something(command: String) = js.native

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

有什么建议吗?

就我个人而言,我可能会将其包装为 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 写成隐含的 class。)

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