我正在尝试访问对象深处可用的属性。如何以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
外观,应该具有属性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] 删除。
我来说两句