gpt4 book ai didi

scala.js - 如何从我的伪联合类型中提取正确的类型

转载 作者:行者123 更新时间:2023-12-02 00:46:27 24 4
gpt4 key购买 nike

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

最佳答案

使用模式匹配:

val jsClassInModule: JSClassInModule = ???
(jsClassInModule.scalajsfunc(): Any) match {
case response: ErrorResponse => ...
case response: TokenResponse => ...
}

归属 : Any 是解决 Scala 类型检查器不知道 | 的特定语义这一事实所必需的,如果你给出虚假的错误消息尝试直接匹配 |

编辑:如果个别类型是 JS traits,即扩展 js.Any 的 traits,以上将不起作用,因为一般来说,不可能用 JS 特征执行 isInstanceOf 测试(这是模式匹配所做的,并且大部分与 | 无关)。相反,您需要编写任何有意义的实例测试代码,然后进行转换。例如,假设我们可以通过测试 errorCode 属性的存在来区分 ErrorResponseTokenResponse,我们可以这样做:

val jsClassInModule: JSClassInModule = ???
(jsClassInModule.scalajsfunc(): Any) match {
case response if js.Object.hasOwnProperty(response, "errorCode") =>
val errorResponse = response.asInstanceOf[ErrorResponse]
...
case response =>
val tokenResponse = response.asInstanceOf[TokenResponse]
...
}

这就是 JavaScript 的丑陋本质。

关于scala.js - 如何从我的伪联合类型中提取正确的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43452472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com