https://kotlinlang.org logo
Title
l

lewik

12/11/2017, 7:56 AM
Я могу создавать js json объекты с помощью https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.js/-json/index.html ?
g

gildor

12/11/2017, 8:07 AM
Как я понимаю нет, это же интерфейс. придется свою имплементацию запровайдить
l

lewik

12/11/2017, 8:07 AM
Ок.
js("{}")
g

gildor

12/11/2017, 8:10 AM
l

lewik

12/11/2017, 8:14 AM
Жаль, типизированного Json нету. Скопипастил И итератора нету
g

gildor

12/11/2017, 8:16 AM
или если хочется что бы выглядело как иницализация объекта, то можно так:
inline fun jsObj(init: dynamic.() -> Unit): dynamic {
    val json = js("{}")
    init(json)
    return json
}

val json = jsObj {
        foo = "baz"
}
l

lewik

12/11/2017, 8:17 AM
Хех... а как красиво Map превратить в Json? )
Хотя... лучше сразу Json "набивать"
g

gildor

12/11/2017, 8:22 AM
Ну как то так еще можно:
json(*myMap.map { (k, v) -> k to v }.toTypedArray())
можно просто написать экстеншн для этого:
fun <T> Map<String, T>.toJson() = json(*map { (k, v) -> k to v }.toTypedArray())
хотя лучше так конечно:
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

lewik

12/11/2017, 9:27 AM
@gildor не понял совсем... Понятно что в реальности что Json что типизированный Json - это
{}
Но когда работаешь в котлине - зачастую хочется работать с
{}
как с Map (не все методы конечно требуются)
g

gildor

12/11/2017, 9:27 AM
типизированный Json - это
{}
?
ну с Json можно работать как с Map
l

lewik

12/11/2017, 9:27 AM
Ну в js коде это все равно будет
{}
Имеется ввиду дополнительное ограничение на стороне kotlin
g

gildor

12/11/2017, 9:28 AM
так чего хочется добиться?
мне кажется работать с json имеет смысл только при получении данных из Js кода или передачи их в js код, и не работать с ним внутри Kotlin кода
l

lewik

12/11/2017, 9:31 AM
И когда передаешь данные в какой то другой фреймворк
Например vuex навесит дополнительные геттеры сеттеры на любое свойство, насколько я понимаю. Соответственно не хочется отдавать в vuex какие то сложные объекты
С другой стороны, все равно придется - списки в свойствах все равно будут котлиновскими списками.
может и правда... забить и отправлять все котлиновское
g

gildor

12/11/2017, 9:34 AM
да, но можно же сделать:
external class SomeConfig(val foo: String, val bar: Int)
и его отдавать
l

lewik

12/11/2017, 9:34 AM
Но это не значит что у него будут copy и прочие
1. или js будет "как обычно", но тогда со стороны котлина - обрезан функционал а со стороны js фреймоврков все работает как часы 2. или js будет сгенерированный котлином, тогда со стороны котлина все ок, а вот со стороны js фреймворков могут пойти непредвиденные сайдэффекты, что очень не хочется получить "посередине продакшена" А хочется - и то и то ) Чтобы и как часы работало и чтобы котлин был полноценный. Вобоще, если и vuex и котлин-js написаны нормально - то все должно работать. Но если есть, например... дублирование данных в котлин отображении каком либо - то все пойдет по швам.
Можно попытаться 3. совместить - и то, что должно быть "чисто на js" - писать с помощью вот этих типизированных json и массивов - но тогда внутри кода начнется свистопляска с переводом из одного в другое, а с ростом проекта это еще и будет по нескольку раз и бессмысленно.
Я вот попробовал 3 и что то вообще .. не весело, при любой операции над "типизированным js" сразу хочется перевести это в нормальный котлин.
Сейчас попробую 2
g

gildor

12/11/2017, 9:43 AM
2. А есть примеры?
l

lewik

12/11/2017, 9:43 AM
Примеры чего именно?
g

gildor

12/11/2017, 9:43 AM
просто выглядит так что и с JS могут быть теже самые эффекты
если уж фреймворк такой
l

lewik

12/11/2017, 9:43 AM
А я не наталкивался на эти эффекты)))
g

gildor

12/11/2017, 9:45 AM
писать с помощью вот этих типизированных json и массивов
не понимаю почему они “типизированные“, ведь они как раз таки динамические
l

lewik

12/11/2017, 9:46 AM
Да, они динамические. Они в сгенерированном js будут типизированные. А на стороне котлина зачастую хочется их (но не все) типизировать, чтобы удобнее работать с ними.
g

gildor

12/11/2017, 9:46 AM
опять же, всегда можно конвертировать динамически котлиновский класс в json если хочется совсем убрать все методы
в сгенерированном js будут типизированные? что-то я не понимаю как
l

lewik

12/11/2017, 9:47 AM
Я знаю что vuex модифицирует то, что я ему передаю. И я не знаю досканально как он модифицирует и как именно внутри устроены kotlin-js объекты. Да, надо конечно изучить и то и то)
Простите.. я оговорился.... В сгенерированном js объекты будут НЕ типизированные - это же просто
{}
. А на стороне котлина для безопасности и просто удобства - хочется ограничить типы.
g

gildor

12/11/2017, 9:49 AM
мне кажется если использовать котлин для js разработки, то нужно его максимально типизировано использовать, иначе все основные фишки теряются
l

lewik

12/11/2017, 9:50 AM
Да, я с вами согласен, я так и хочу.
g

gildor

12/11/2017, 9:50 AM
ну можно посмотреть как устроены, ничего магического там нет
можно просто в рантайме получить все поля котлиновского объекта и сделать из них json, тогда уж наверняка
хотя опять же, котлиновский объект просто с полями очень простой
l

lewik

12/11/2017, 9:52 AM
Он то простой - а Map и List - не очень
g

gildor

12/11/2017, 10:01 AM
это да, но я бы не сильно беспокоился, в js все динамическое, кто угодно может что угодно сделать, мне кажется ситуация от чистого js не сильно отличается
для конфигов можно array вместо list использовать
l

lewik

12/11/2017, 10:07 AM
А kotlin для генерации html не использовали? )
g

gildor

12/11/2017, 10:07 AM
Нет
s

semoro

12/11/2017, 11:47 AM
В Котлине есть замечательная библиотека DSL для генерации HTML https://github.com/Kotlin/kotlinx.html
l

lewik

12/11/2017, 11:48 AM
Да, я в курсе, спасибо.
👍 1
Намереваюсь попробовать вот это. https://github.com/nosix/vue-kotlin И как раз воткнуть вышеуказанный DSL
В котлине и так есть типизированный
[]
Это 'Array<T>' который в js выглядит как '[]' Даже
toTypedArray()
есть
c

caffeine

12/11/2017, 1:29 PM
я котлином генерирую HTML+CSS
)
прекрасно работает
между сервером и клиентом у меня kotlin-common
👍 1
так что DTO объекты прекрасно передаются туда-сюда )
и как-то без node.js и web-pack обошолся )