如何从我的pseduo-union类型中提取正确的类型

时间:2017-04-17 13:29:47

标签: scala.js

我有一个从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,我如何惯用地将返回值归结为我的伪联合类中指定的两个类之一?

1 个答案:

答案 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的丑陋本性。