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

拉杰夫

我正在尝试访问对象深处可用的属性。如何以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不是的属性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),但是有时这会产生太多开销。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章