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 使用 function
和 prototype
将 类 脱糖为 ECMAScript 5.1 中的 "close enough" 表示。只要您不尝试扩展其他 ECMAScript class
es(您可以扩展其他基于 function
的 "classes"),这种足够接近的脱糖就是有效的。
如果您需要扩展适当的 ES class
,您还需要告诉 Scala.js 发出 ECMAScript 2015 class
es。这可以通过以下 sbt 配置来完成:
// in a single-project build:
scalaJSLinkerConfig ~= { _.withESFeatures(_.withUseECMAScript2015(true)) }
// in a multi-project build:
lazy val myJSProject = project.
...
settings(
scalaJSLinkerConfig ~= { _.withESFeatures(_.withUseECMAScript2015(true)) }
)
在节点 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 使用 function
和 prototype
将 类 脱糖为 ECMAScript 5.1 中的 "close enough" 表示。只要您不尝试扩展其他 ECMAScript class
es(您可以扩展其他基于 function
的 "classes"),这种足够接近的脱糖就是有效的。
如果您需要扩展适当的 ES class
,您还需要告诉 Scala.js 发出 ECMAScript 2015 class
es。这可以通过以下 sbt 配置来完成:
// in a single-project build:
scalaJSLinkerConfig ~= { _.withESFeatures(_.withUseECMAScript2015(true)) }
// in a multi-project build:
lazy val myJSProject = project.
...
settings(
scalaJSLinkerConfig ~= { _.withESFeatures(_.withUseECMAScript2015(true)) }
)