我有一个从js返回的伪联盟类型。
这是我的scalajs:
@js.native trait ErrorResponse extends js.Object { val error: String = js.native val errorDescription: String = js.native } @js.native trait TokenResponse extends js.Object{ val accessToken: String = js.native val expriseOn: js.Date = js.native val tokenType: String = js.native val userId: String = js.native val identityProvider: String = js.native }
和我的scalajs
@js.native @JSImport("mymodule", "JSClassInModule") class JSClassInModule extends js.Object { // ... def scalajsfunc(): ErrorResponse | TokenResponse = js.native // .. }
如果我调用scalajsfunc,我如何惯用地将返回值归结为我的伪联合类中指定的两个类之一?
答案 0 :(得分:2)
使用模式匹配:
val jsClassInModule: JSClassInModule = ???
(jsClassInModule.scalajsfunc(): Any) match {
case response: ErrorResponse => ...
case response: TokenResponse => ...
}
为了解决Scala类型检查程序不知道: Any
的特定语义这一事实,必须使用归属|
,如果您尝试直接匹配{{}},则会出现虚假错误消息{1}}。
编辑:如果各个类型是 JS特征,即扩展|
的特征,则上述操作不起作用,因为通常它不是可以使用JS特征执行js.Any
测试(这是模式匹配的作用,并且与isInstanceOf
大多无关)。相反,您需要编写任何有意义的实例测试,然后进行转换。例如,假设我们可以通过测试|
属性的存在来告诉ErrorResponse
TokenResponse
,我们可以这样做:
errorCode
这就是JavaScript的丑陋本性。