如何为在 ScalaJS 中发出事件的方法定义外观

how to define facade for a method that emits events in ScalaJS

我正在为 pouchdb

编写 scalajs facade

代码:https://gist.github.com/chandu0101/62013de47bf5ee4d2412

如何为 API 名称 changes 定义外观,它发出事件和 return 取消方法..

定义Scala.js外观类型就是将静态类型赋予JavaScriptAPI。通常 JavaScript 的文档会 提及类型,因此可以很容易地将其翻译成正式定义。

在这种情况下,changes 方法 returns 和 EventEmitter,这是您首先需要的。让我们定义这个类型,特别是它的 on 方法:

class EventEmitter extends js.Object {
  def on(event: String, listener: js.Function): this.type = js.native
  ...
}

不幸的是,我们必须非常不精确地确定 listener 的类型,因为实际类型在很大程度上取决于事件字符串以及该发射器的特定用途。一般来说,我们目前无法预测任何事情。

EventEmitter 的文档没有提到 cancel() 方法,这有点奇怪,因为显然可以在 changes 返回的发射器上调用该方法。所以我们将为 changes:

返回的特定发射器定义一个子类型
trait ChangesEventEmitter extends EventEmitter {
  def cancel(): Unit = js.native
}

我们还可以利用这一专门特性为特定事件启用更精确类型的侦听器。在这种情况下,让我们为 change 事件执行此操作:

object ChangesEventEmitter {
  implicit class ChangesEventEmitterEvents(
      val self: ChangesEventEmitter) extends AnyVal {
    def onChange(listener: js.Function1[js.Dynamic, Any]): self.type =
      self.on("change", listener)
  }
}

最后,您需要 db.changes 方法的 options 参数的类型。类型本身通常是具有许多不可变字段的特征:

trait DBChangesOptions extends js.Object {
  val include_docs: js.UndefOr[Boolean] = js.native
  val limit: js.UndefOr[Int] = js.native
  ...
}

构造这种类型的实例,您可以在带有默认参数的伴随对象中使用apply方法(参见this SO question ), 或者你可以为它创建一个类似 Builder 的 class。

现在,我们终于可以声明 changes 方法本身了:

def changes(options: DBChangesOptions = ???): ChangesEventEmitter = js.native