创建具有多种可能的 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)
}
存在从 ManifestFacade
到 ManifestCommands
的隐式转换。 (这是古老的代码;现在,我会把 ManifestCommands
写成隐含的 class。)
前期需要付出一些额外的努力,但这允许应用程序代码在良好的强类型级别上工作,而无需担心各种命令在后台调用疯狂多态函数的方式。
我正在尝试为现有的 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)
}
存在从 ManifestFacade
到 ManifestCommands
的隐式转换。 (这是古老的代码;现在,我会把 ManifestCommands
写成隐含的 class。)
前期需要付出一些额外的努力,但这允许应用程序代码在良好的强类型级别上工作,而无需担心各种命令在后台调用疯狂多态函数的方式。