如何在 Scala.js 中将 js.UndefOr[T] <–> Option[T] 与 js.native 映射?

Joh*_*Doe 1 scala scala.js

我正在尝试扩展Navigatoroscpu属性。这个问题已经在这里得到了回答并且按照Justin du Coeur 的建议,实现工作完美。问题是,当我在 Firefox 以外的浏览器中执行代码时,我得到一个UndefinedBehaviorError异常,这是合乎逻辑的,因为此属性仅存在于 Firefox 中。

但是,我不想接收异常,而是只想使用Option. 所以如果它不存在,它就会存在,如果存在,None我会得到Some("OSCPU info").

我怎样才能使这项工作?我尝试了以下方法,但我不确定如何转换为Option.

@js.native
trait OSCPUNavigator extends js.Object {
  def oscpu: js.UndefOr[String] = js.native
}
implicit def toOSCPUNavigator(n: Navigator): OSCPUNavigator =
    n.asInstanceOf[OSCPUNavigator]
Run Code Online (Sandbox Code Playgroud)

sjr*_*jrd 5

您可以将 a 转换js.UndefOr[A]Option[A]with x.toOption

相反的转换也可以作为x.orUndefined,但需要以下导入:

import scala.scalajs.js.JSConverters._
Run Code Online (Sandbox Code Playgroud)

这记录在https://www.scala-js.org/doc/interoperability/types.html

  • 注意:`js.UndefOr[A]` 也可能包含 `null`,具体取决于您面对的 JS 代码。如果是这种情况,则需要单独处理。 (3认同)