使用多种可能的返回类型创建scala.js外观

时间:2017-06-27 20:59:44

标签: scala scala.js

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

def something(command: String) = js.native

现在的问题是,在实际的javascript库中,这个方法为一个command值返回一个String,并为另一个command值返回一个JQuery。我不知道该方法的返回类型是什么。我想把它保持为js.Any然后用户必须使用asInstanceOf将它转换为相应的类型,但我认为它可以更好的方式处理。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

就个人而言,我可能会将它包装为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写为隐式类。)

预先做了一些额外的努力,但是这允许应用程序代码在一个漂亮的,强类型的级别上工作,而不用担心各种命令在引擎盖下真正调用泛多态函数的方式。