ScalaJs 和 Javascript 的 "implements" 特征是否有一些替代方案

Is it some alternatives to "implements" traits with ScalaJs and Javascript

我有这段代码,我希望能够以 Javascript :

的形式执行
@JSExport
class Feeder {

  @JSExport
  def feed(feedable: Feedable): Unit = {
    feedable.feed();
  }
}

trait Feedable {
  def feed()
}

当然不能导出特征,但我希望一种模式匹配就足够了。所以我试图用 feed 函数创建一个 Javascript 对象,但它也失败了:

var feeder = new test.Feeder();
var feedable = new function() {
  this.feed = function() {
    console.log('Feeding javascript');
  }
}
feeder.feed(feedable);

但这引发了一个例外:

scala.scalajs.runtime.UndefinedBehaviorError: An undefined behavior was detected: [object Object] is not an instance of test.Feedable

是否有实现此行为的方法?

我不能说我 100% 确定你想要完成什么,但它 看起来 就像你试图定义 feed来自 JavaScript 的函数。在这种情况下,您不想导出 Scala class,而是想将 Feedable 定义为外观:

trait Feedable extends js.Object {
  def feed():Unit = js.native
}

这是此代码的唯一方法:

this.feed = function() {
  console.log('Feeding javascript');
}

好像有点道理。

Facades 是您告诉 Scala JavaScript 代码结构的方式,这似乎是您在这里尝试做的事情。有关详细信息,请参阅 calling JavaScript from Scala 上的页面...

这里你实际上想声明 Feedable 为 JavaScript 类型,而不是 Scala 类型。所以你必须声明它扩展 js.Object 像这样:

trait Feedable extends js.Object {
  def feed(): Unit = js.native
}

扩展 js.ObjectFeedable 变成原始 JS 类型,Scala.js 编译器知道使用 JavaScript 语义而不是 Scala 语义来操作它。