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

How to map js.UndefOr[T] <–> Option[T] with js.native in Scala.js?

我正在尝试用 oscpu 属性 扩展 Navigator。这个问题已经回答 and the implementation works perfectly as proposed by 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]

您可以使用 x.toOptionjs.UndefOr[A] 转换为 Option[A]

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

import scala.scalajs.js.JSConverters._

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