2

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

4

1 回答 1

2

嗯,internetMessageId不是 的属性OfficeOffice需要有属性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),但有时开销太大。

于 2017-10-03T05:39:56.333 回答