Javascript 访问ScalaJS中JS对象的嵌套属性
我正在尝试访问对象内部深处的可用属性。如何以scala js类型安全的方式实现这一点 internetMessageId属性在Office对象上可用,可通过以下方式在纯javascript中访问: Office.context.mailbox.item.internetMessageId Office对象的我的scala JS外观:Javascript 访问ScalaJS中JS对象的嵌套属性,javascript,scala.js,binding.scala,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.Functio
@js.native
@JSGlobal
object Office extends js.Object {
var initialize:js.Function1[String, _] = js.native
}
如何在ScalaJs中为Office对象上的属性internetMessageId编写访问方法?嗯,
internetMessageId
不是Office
的属性Office
需要有属性cotnext
,为其定义一个@js.native trait Context
facade,它应该有一个属性邮箱
,为其定义一个@js.native trait Context
facade,依此类推,直到到达@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提供的对象时,必须在某个地方包含“type unsafety”。最好将其包含在立面内(选项1),但有时这会造成太多开销