在 ScalaJS 中访问嵌套的 属性 个 JS 对象

Access nested property of JS Object in ScalaJS

我正在尝试访问对象内部深处可用的 属性。如何在 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 needs to have 属性 cotnext, 为它定义一个 @js.native trait Context facade, 它应该有一个 属性 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 提供的对象时,您必须在某处包含 "type-unsafety"。最好将它包含在外观中(选项 1),但有时开销太大。