2017-10-03 13 views
2

개체의 내부에서 사용할 수있는 속성에 액세스하려고합니다. 어떻게 scala js 타입 안전한 방법으로 이것을 하는가?ScalaJS에서 JS Object의 중첩 된 속성에 액세스합니다.

internetMessageId 속성은 아래의 방법으로 일반 자바 스크립트에서 액세스 할 수있는 Office 개체로 볼 수 있습니다 :

Office.context.mailbox.item.internetMessageId

Office 개체의 내 스칼라 JS 외관 :

@js.native 
@JSGlobal 
object Office extends js.Object { 
    var initialize:js.Function1[String, _] = js.native 
} 

ScalaJs의 Office 개체에 internetMessageId 속성에 대한 액세스 방법을 쓰는 방법은 무엇입니까?

답변

1

글쎄, internetMessageIdOffice의 속성이 아닙니다. Office은 당신이 @js.native trait Context 외관을 정의하는 속성 mailbox을 가지고 있고, 그래서 당신이 마지막으로 속성 internetMessageId을 정의 @js.native trait Item에 도달 할 때까지해야 @js.native trait Context 외관을 정의하는 특성 cotnext을 가질 필요가있다. 이 계층 구조에 대한

예 형질 코드 :

@js.native 
trait Context extends js.Object { 
    val mailbox: Mailbox = js.native 
} 

그런 다음 Office.context.mailbox.item.internetMessageId이 실제로 유효한 형식 검사 스칼라 코드가 될 것입니다.

그러나, @js.native 외벽을 정의 할 때 Scala 컴파일러는 올바르게 정의했다고 가정합니다. 예를 들어 첫 번째 단락에서했던 것처럼 context 철자가 틀리면 런타임에 코드가 실패합니다. 그래서 당신의 타입 안전은 당신의 정면과 마찬가지로 좋습니다. 당신은 단지 전체 중첩 된 구조에서이 하나의 필드에 액세스해야하는 경우

그래서, 당신은 js.Dynamic를 사용하여 비 형태 보증 된 방법으로 중첩 필드에 액세스 할 것이다, 다만 어딘가에 일부 getInternetMessageId 방법을 정의하여 시간을 절약 할 수 있습니다 . 그것은 좀 이상하고 임시적으로 보일 것입니다. 그러나 그것은 그것이 있기 때문입니다. 하지만 덜 형식 안전하지 않을 것입니다.

요점은 JS 제공 객체를 처리 할 때 어딘가에 "유형 안전하지 않은"것을 포함해야한다는 것입니다. 그것은 정면 (옵션 1) 안에 그것을 포함하는 것이 가장 좋지만 때로는 너무 많은 간접비입니다.