我收到了一个JavaScript对象以响应远程HTTP请求。我有一个kotlin模型(trait),它定义了我期望在对象上的各种字段(可空的字段是可选的)。
首先,我想进行is
检查,以确保我的对象实际上是预期的类型。我最初尝试过payload is MyModel
,但由于{k}在kotlin.js中编写is
运算符的方式,因此无效。
其次,我想要转换为MyModel
,以便在我使用它时可以在对象上获得自动完成等。通常情况下,仅is
就足够了,但由于这不起作用,我也需要解决这个问题。
我想避免从dynamic
手动填充我的对象。我不介意这么做,如果我可以使用by Delegates.mapVal(...)
,但这需要Map<String, Any?>
而且我不知道如何将我的dynamic
/ Any?
有效负载放入Map<String, Any?>
。
答案 0 :(得分:3)
1)由于性能原因,我们没有is
的结构检查。
我不确定我们是否需要通用的解决方案,但无论如何我创建了issue about it,随时投票或加星标以获得更新。
2)is
如果您使用smart cast就足够了,例如:
if (payload is MyModel) {
// call MyModel members on payload
}
但不要忘记(1):)
3)你可以这样写:
class MapDynamic<out V>(val d: dynamic) {
public fun get(thisRef: Any, desc: PropertyMetadata): V {
return d[desc.name]
}
}
class Foo(data: dynamic) {
val field: Int by MapDynamic(data)
}
fun main(args : Array<String>) {
val f = Foo(object { val field = 123 })
println(f.field)
}
但它看起来过于冗长,但您可以添加额外的逻辑,例如当数据没有请求字段时。如果你不需要自定义逻辑,我认为演员就足够了。
答案 1 :(得分:0)
对于演员的第二部分,您可以这样做:
fun responseHandler(payload: dynamic) {
val myModel = payload as MyModel
}
或
fun responseHandler(payload: dynamic) {
val myModel: MyModel = payload
}
如果有效负载为空,这将抛出NPE,但它实际上不会验证有效负载是否与MyModel匹配。特别是,如果有效负载缺少那些字段/属性,则最终可能不会出现空字段/属性。