我正在尝试访问对象深处可用的属性。如何在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的访问方法?
答案 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),但有时候开销太多了。