Я могу создавать js json объекты с помощью <https:...
# russian
l
Я могу создавать js json объекты с помощью https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.js/-json/index.html ?
g
Как я понимаю нет, это же интерфейс. придется свою имплементацию запровайдить
l
Ок.
js("{}")
g
l
Жаль, типизированного Json нету. Скопипастил И итератора нету
g
или если хочется что бы выглядело как иницализация объекта, то можно так:
Copy code
inline fun jsObj(init: dynamic.() -> Unit): dynamic {
    val json = js("{}")
    init(json)
    return json
}

val json = jsObj {
        foo = "baz"
}
l
Хех... а как красиво Map превратить в Json? )
Хотя... лучше сразу Json "набивать"
g
Ну как то так еще можно:
Copy code
json(*myMap.map { (k, v) -> k to v }.toTypedArray())
можно просто написать экстеншн для этого:
Copy code
fun <T> Map<String, T>.toJson() = json(*map { (k, v) -> k to v }.toTypedArray())
хотя лучше так конечно:
Copy code
fun <T> Map<String, T>.toJson(): Json {
    val res: dynamic = js("({})")
    for ((name, value) in this) {
        res[name] = value
    }
    return res
}
типизированного Json нету
смотря что иметь в виду. Типизированный “json” это же просто создание объекта класса или интерфейса в Kotlin
l
@gildor не понял совсем... Понятно что в реальности что Json что типизированный Json - это
{}
Но когда работаешь в котлине - зачастую хочется работать с
{}
как с Map (не все методы конечно требуются)
g
типизированный Json - это
{}
?
ну с Json можно работать как с Map
l
Ну в js коде это все равно будет
{}
Имеется ввиду дополнительное ограничение на стороне kotlin
g
так чего хочется добиться?
мне кажется работать с json имеет смысл только при получении данных из Js кода или передачи их в js код, и не работать с ним внутри Kotlin кода
l
И когда передаешь данные в какой то другой фреймворк
Например vuex навесит дополнительные геттеры сеттеры на любое свойство, насколько я понимаю. Соответственно не хочется отдавать в vuex какие то сложные объекты
С другой стороны, все равно придется - списки в свойствах все равно будут котлиновскими списками.
может и правда... забить и отправлять все котлиновское
g
да, но можно же сделать:
Copy code
external class SomeConfig(val foo: String, val bar: Int)
и его отдавать
l
Но это не значит что у него будут copy и прочие
1. или js будет "как обычно", но тогда со стороны котлина - обрезан функционал а со стороны js фреймоврков все работает как часы 2. или js будет сгенерированный котлином, тогда со стороны котлина все ок, а вот со стороны js фреймворков могут пойти непредвиденные сайдэффекты, что очень не хочется получить "посередине продакшена" А хочется - и то и то ) Чтобы и как часы работало и чтобы котлин был полноценный. Вобоще, если и vuex и котлин-js написаны нормально - то все должно работать. Но если есть, например... дублирование данных в котлин отображении каком либо - то все пойдет по швам.
Можно попытаться 3. совместить - и то, что должно быть "чисто на js" - писать с помощью вот этих типизированных json и массивов - но тогда внутри кода начнется свистопляска с переводом из одного в другое, а с ростом проекта это еще и будет по нескольку раз и бессмысленно.
Я вот попробовал 3 и что то вообще .. не весело, при любой операции над "типизированным js" сразу хочется перевести это в нормальный котлин.
Сейчас попробую 2
g
2. А есть примеры?
l
Примеры чего именно?
g
просто выглядит так что и с JS могут быть теже самые эффекты
если уж фреймворк такой
l
А я не наталкивался на эти эффекты)))
g
писать с помощью вот этих типизированных json и массивов
не понимаю почему они “типизированные“, ведь они как раз таки динамические
l
Да, они динамические. Они в сгенерированном js будут типизированные. А на стороне котлина зачастую хочется их (но не все) типизировать, чтобы удобнее работать с ними.
g
опять же, всегда можно конвертировать динамически котлиновский класс в json если хочется совсем убрать все методы
в сгенерированном js будут типизированные? что-то я не понимаю как
l
Я знаю что vuex модифицирует то, что я ему передаю. И я не знаю досканально как он модифицирует и как именно внутри устроены kotlin-js объекты. Да, надо конечно изучить и то и то)
Простите.. я оговорился.... В сгенерированном js объекты будут НЕ типизированные - это же просто
{}
. А на стороне котлина для безопасности и просто удобства - хочется ограничить типы.
g
мне кажется если использовать котлин для js разработки, то нужно его максимально типизировано использовать, иначе все основные фишки теряются
l
Да, я с вами согласен, я так и хочу.
g
ну можно посмотреть как устроены, ничего магического там нет
можно просто в рантайме получить все поля котлиновского объекта и сделать из них json, тогда уж наверняка
хотя опять же, котлиновский объект просто с полями очень простой
l
Он то простой - а Map и List - не очень
g
это да, но я бы не сильно беспокоился, в js все динамическое, кто угодно может что угодно сделать, мне кажется ситуация от чистого js не сильно отличается
для конфигов можно array вместо list использовать
l
А kotlin для генерации html не использовали? )
g
Нет
s
В Котлине есть замечательная библиотека DSL для генерации HTML https://github.com/Kotlin/kotlinx.html
l
Да, я в курсе, спасибо.
👍 1
Намереваюсь попробовать вот это. https://github.com/nosix/vue-kotlin И как раз воткнуть вышеуказанный DSL
В котлине и так есть типизированный
[]
Это 'Array<T>' который в js выглядит как '[]' Даже
toTypedArray()
есть
c
я котлином генерирую HTML+CSS
)
прекрасно работает
между сервером и клиентом у меня kotlin-common
👍 1
так что DTO объекты прекрасно передаются туда-сюда )
и как-то без node.js и web-pack обошолся )