如何在名称中使用`.`定义全局范围方法

时间:2017-07-01 03:16:00

标签: scala scala.js

我正在尝试为https://facebook.github.io/jest/docs/en/api.html#testonlyname-fn

定义外观
@JSGlobalScope
@js.native
object JestGlobal extends js.Object {

  def test(str: String, function: js.Function0[_]): Unit = js.native

  @JSName("test.only")
  def testOnly(str: String, function: js.Function0[_]): Unit = js.native

  def expect[T](in:T) : Matcher[T] = js.native

}

@js.native
trait Matcher[T] extends js.Object {

  def toBe(in:T):Unit = js.native
}
  

调用名称无效的全局范围的方法   不允许使用JavaScript标识符。 [错误]见   https://www.scala-js.org/doc/interoperability/global-scope.html   进一步的信息。

编辑:(答案)

 def test : JestTestObject = js.native

@js.native
trait JestTestObject extends js.Object {

  def only(str: String, function: js.Function0[_]): Unit = js.native
}

1 个答案:

答案 0 :(得分:1)

出于所有实际目的,没有名称为test.only的JS函数。更有可能的是,有一个名为test的顶级对象,并且它有一个名为only的方法。您可以将其建模为:

@js.native
@JSGlobal("test")
object JestTest extends js.Object {
  def only(str: String, function: js.Function0[_]): Unit = js.native
}

您还可以使用相同的对象来表示名称为test的顶级函数(因为显示库是这样的),通过添加apply方法:

@js.native
@JSGlobal("test")
object JestTest extends js.Object {
  // This is the test(...) function
  def apply(str: String, function: js.Function0[_]): Unit = js.native

  // This is the test.only(...) function
  def only(str: String, function: js.Function0[_]): Unit = js.native
}

您的变体作为自我回答也是有效的,但可以使其更加惯用,如下所示:

@js.native
@JSGlobalScope
object JestGlobal extends js.Object {

  @js.native
  object test extends js.Object {
    // This is the test(...) function
    def apply(str: String, function: js.Function0[_]): Unit = js.native

    // This is the test.only(...) function
    def only(str: String, function: js.Function0[_]): Unit = js.native
  }

  def expect[T](in: T): Matcher[T] = js.native

}