我有一个演员从播放2.3中的websocket接收JsValue.我还有一个定义Reads转换器的case类.当我尝试对案例类进行模式匹配时,它总是匹配JsValue而不是case类.
case class Ack(messageType: String, messageId: Int){
implicit val ackReads: Reads[Ack] = (
(JsPath \ "message_type").read[String] and
(JsPath \ "message_id").read[Int]
)(Ack.apply _)
}
class ChannelActor(out: ActorRef) extends Actor{
def receive = {
case a: Ack =>
println(s"Acknowledged! $a")
case msg: JsValue =>
println("Got other jsvalue")
case _ =>
println("Got something else")
}
}
Run Code Online (Sandbox Code Playgroud)
我如何模式匹配我从websocket接收的JsValue与案例类中的Reads验证器?
编辑:我找到了一种解决方法,通过手动模式匹配JsValue来找出我需要验证的类型.代码现在看起来像这样:
case class Ack(messageType: String, messageId: Int)
object Ack{
implicit val ackReads: Reads[Ack] = (
(JsPath \ "message_type").read[String](verifying[String](_ == "ack")) and
(JsPath \ "message_id").read[Int]
)(Ack.apply _) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为此函数编写签名:
export function objToArray(obj){
let ret = [];
for(const key of Object.keys(obj)){
ret.push(Object.assign({objKey: key.toString()}, obj[key]));
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
因此,对于包含 UI 类型值的 T 类型对象,要返回Array<U & {objKey: string}>
。我不知道如何用打字稿做到这一点。