在ScalaJS中访问JS Object的嵌套属性

时间:2017-10-03 04:06:44

标签: javascript scala.js binding.scala

我正在尝试访问对象深处可用的属性。如何在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的访问方法?

1 个答案:

答案 0 :(得分:1)

好吧,internetMessageId不是Office的属性。 Office需要拥有属性cotnext,您要为其定义@js.native trait Context外观,该外观应具有属性mailbox,您可以为其定义@js.native trait Context外观,依此类推,直至到达最终定义属性@js.native trait Item的{​​{1}}。

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

internetMessageId

然后@js.native trait Context extends js.Object { val mailbox: Mailbox = js.native } 实际上是有效的,经过类型检查的Scala代码。

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

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

我的观点是,在处理JS提供的对象时,您必须在某处包含“type-unsafety”。最好将它包含在外墙内(选项1),但有时候开销太多了。