extending js.native class yields TypeError: Class constructor cannot be invoked without 'new'

extending js.native class yields TypeError: Class constructor cannot be invoked without 'new'

在节点 scala.js 和 运行 中扩展 @js.native class 时出现类型错误。

object MainApp {
  def main(args: Array[String]): Unit = {
    println(new B())
  }
}

class B extends A

@js.native
@JSImport("example", "A")
class A extends js.Object

运行 抱怨没有调用 new:

TypeError: Class constructor A cannot be invoked without 'new'

生成的代码不会在原生父 class 上调用 new

/** @constructor */
var $c_LB = (function $c_LB() {
    $i_[=12=]40test[=12=]2dtest[=12=]2ftest.B.call(this)
});

默认情况下,Scala.js 使用 functionprototype 将 类 脱糖为 ECMAScript 5.1 中的 "close enough" 表示。只要您不尝试扩展其他 ECMAScript classes(您可以扩展其他基于 function 的 "classes"),这种足够接近的脱糖就是有效的。

如果您需要扩展适当的 ES class,您还需要告诉 Scala.js 发出 ECMAScript 2015 classes。这可以通过以下 sbt 配置来完成:

// in a single-project build:
scalaJSLinkerConfig ~= { _.withESFeatures(_.withUseECMAScript2015(true)) }

// in a multi-project build:
lazy val myJSProject = project.
  ...
  settings(
    scalaJSLinkerConfig ~= { _.withESFeatures(_.withUseECMAScript2015(true)) }
  )