Seth Madison
03/19/2023, 2:25 AMturansky
03/19/2023, 4:29 PMSeth Madison
03/19/2023, 5:39 PMinterface FooCommon {
val bar: String
}
I want to be able to do:
external interface FooJs : FooCommon {
val bar: String
}
fun parseJs(): FooCommon {
val myDynamic = js("""{bar: "baz"}""")
return myDynamic.unsafeCast<FooJs>()
}
Instead I have to do something like;
external interface FooJs {
val bar: String
}
class FooCommonFromJs(private val fooJs: FooJs) : FooCommon {
override val bar: String
get() = fooJs.bar
}
fun parseJs(): FooCommon {
val myDynamic = js("""{bar: "baz"}""")
return FooCommonFromJs(myDynamic.unsafeCast<FooJs>())
}
turansky
03/19/2023, 6:53 PMjso
for such casesfun parseJs(): FooCommon =
jso {
bar = "baz"
}
Seth Madison
03/20/2023, 3:34 AMjso
.
It looks like it just casts whatever you pass as the type param, which I think is the equivalent of:
fun parseJs(): FooCommon {
val myDynamic = js("""{bar: "baz"}""")
return myDynamic.unsafeCast<FooCommon>()
}
Originally I tried this:
fun parseJs() {
val myDynamic = js("""{bar: "baz"}""")
val a = myDynamic.unsafeCast<FooCommon>()
console.log(a.bar)
}
And it didn’t work because FooCommon
was not @JsExported
!!! It turns out, if you @JsExport
a “normal” class, it forces the compiler to not generate JS properties that mirror the kotlin property names, and so an unsafeCast()
will “just work”.@JsExport
interface FooCommon {
val bar: String
}
fun parseJs(): FooCommon {
val myDynamic = js("""{bar: "baz"}""")
return myDynamic.unsafeCast<FooCommon>()
}
turansky
03/20/2023, 7:03 AMjso
recommended in any case@JsExport
@ExternalInJsPleas
interface FooCommon {
val bar: String
}
fun parseJs(): FooCommon {
FooCommon(bar = "baz")
}