Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 访问ScalaJS中JS对象的嵌套属性_Javascript_Scala.js_Binding.scala - Fatal编程技术网

Javascript 访问ScalaJS中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

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

嗯,
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),但有时这会造成太多开销