ScalaJS:如何从 JS 创建 Option[A]?

ScalaJS: How to create Option[A] from JS?

我有一个 ScalaJS 函数,我想从 JS 调用它,它有一个 Option[String] 参数。我不知道如何从 JS 创建 Some[String] 和 None[String]。

简答:你不能。不过,您的问题有两种解决方案。

公开全局函数以构造 Some 并检索 None(次优)

在您的 Scala.js 代码库中添加这样的对象:

package some.pack

@JSExport
object OptionFactory {
  @JSExport
  def none(): None.type = None

  @JSExport
  def some[A](value: A): Some[A] = Some(value)
}

您现在可以使用 JS 中的工厂来创建选项:

var none = some.pack.OptionFactory.none()
var some = some.pack.OptionFactory.some(5)

直接公开一个API操纵js.UndefOr(推荐)

您可以直接从您的 Scala.js class 公开一个 JS 友好的 API,而不是强制 JS 操纵 Options。假设您要公开的函数类似于:

def foo(opt: Option[Int]): Unit = ???

您可以改为或另外导出以下 JS 友好版本:

@JSExport
def foo(opt: js.UndefOr[Int]): Unit = foo(opt.toOption)

这将允许 JS 简单地使用 undefined 表示 None 和任何整数表示 Some[Int],例如:

scalaJSObj.foo(undefined)
scalaJSObj.foo(5)