【问题标题】:Access nested property of JS Object in ScalaJS在 ScalaJS 中访问 JS 对象的嵌套属性
【发布时间】:2018-03-14 04:57:14
【问题描述】:

我正在尝试访问在对象深处可用的属性。如何以 scala js 类型安全的方式做到这一点?

internetMessageId 属性在 Office 对象上可用,可通过以下方式在纯 javascript 中访问:

Office.context.mailbox.item.internetMessageId

我的 Office 对象的 scala JS 外观:

@js.native
@JSGlobal
object Office extends js.Object {
  var initialize:js.Function1[String, _] = js.native
}

如何在ScalaJs中为Office对象编写属性internetMessageId的访问方法?

【问题讨论】:

    标签: javascript scala.js binding.scala


    【解决方案1】:

    好吧,internetMessageId 不是Office 的属性。 Office 需要有属性cotnext,为它定义一个@js.native trait Context 门面,它应该有一个属性mailbox,为它定义一个@js.native trait Context 门面,依此类推,直到你到达@js.native trait Item最后定义了一个属性internetMessageId

    此层次结构的示例特征代码:

    @js.native
    trait Context extends js.Object {
      val mailbox: Mailbox = js.native
    }
    

    那么Office.context.mailbox.item.internetMessageId 实际上是有效的、经过类型检查的 Scala 代码。

    但是,请记住,在定义此类 @js.native 外观时,Scala 编译器会假定您已正确定义它们。所以如果你有例如context 拼写错误,就像我在第一段中所做的那样,您的代码将在运行时失败。所以你的类型安全和你的门面一样好。

    因此,如果您只需要访问整个嵌套结构中的这一字段,您可以通过在某处定义一些 getInternetMessageId 方法来节省时间,该方法将以非类型安全的方式访问深度嵌套的字段,使用js.Dynamic。它看起来有点奇怪和临时,但那是因为它是。但它不会降低类型安全性。

    我的意思是,在处理 JS 提供的对象时,您必须在某处包含“类型不安全”。最好将其包含在外观中(选项 1),但有时开销太大。

    【讨论】:

      猜你喜欢
      • 2012-11-12
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 2021-03-12
      • 2015-02-08
      • 1970-01-01
      相关资源
      最近更新 更多