Прямое приведение KotlinJs терпит неудачу, в то время как общие преобразования работают

Не уверен, что это несоответствие в приведении типа или я использую его неправильно. Прямое приведение выдает ошибку, но использование универсального приведение заставит мой код работать.

Ниже я пытаюсь сыграть Json Person

import kotlin.js.Json

data class Person(val name: String)

fun main(args: Array<String>) {

    val persons: Json = JSON.parse("""{ "p1": { name: "foo" } } """)

    val p1: Person = persons.get("p1") as Person    // throws ClassCastException("Illegal cast")

    fun <T> Json.typedGet(s: String): T = this.get(s) as T
    val p2: Person = persons.typedGet("p1")         // but this works!!

}

Прямое приведение, кажется, генерирует код, который проверяет фактическое Person учебный класс

val p1: Person = persons.get("p1") as Person 

// generated javascript (note type check with *Person*)
// var p1 = Kotlin.isType(tmp$ = persons['p1'], Person) ? tmp$ : Kotlin.throwCCE()

Похоже, что типовое приведение генерирует код, который проверяет Any

fun <T> Json.typedGet(s: String): T = this.get(s) as T
val p2: Person = persons.typedGet("p1")  

// generates javascript (note type check with *Any*)
// var p1 = Kotlin.isType(tmp$ = persons['p1'], Any) ? tmp$ : Kotlin.throwCCE()

Должны ли мы всегда использовать общий состав? Или есть какой-то правильный способ сделать это?

0 ответов

Другие вопросы по тегам