我正在尝试为现有的JavaScript库创建一个scala.js外观。这一特定功能具有以下特征:
def something(command: String) = js.native
现在的问题是,在实际的javascript库中,这个方法为一个command值返回一个String,并为另一个command值返回一个JQuery。我不知道该方法的返回类型是什么。我想把它保持为js.Any然后用户必须使用asInstanceOf将它转换为相应的类型,但我认为它可以更好的方式处理。
有什么建议吗?
答案 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)
}
从ManifestFacade
到ManifestCommands
的隐式转换。 (这是古老的代码;现在,我会将ManifestCommands
写为隐式类。)
预先做了一些额外的努力,但是这允许应用程序代码在一个漂亮的,强类型的级别上工作,而不用担心各种命令在引擎盖下真正调用泛多态函数的方式。