Size: a a a

2019 September 25

IG

Ilya Goncharov in Kotlin JS
На файл значит, что в этом модуле есть InspireTree, и модуль рассматривается как неймспейс, если мне не изменяет память
источник

AN

Alexander Nozik in Kotlin JS
О, зафурыкало вроде. Упало, но в другом месте. Спасибо!
источник

AN

Alexander Nozik in Kotlin JS
Вообще. В Kotlin-JS есть только одна проблема : JS. Найти нормально написанную библиотеку практически не возможно.
источник

Н

Напыщенное Эго in Kotlin JS
Самая большая проблема это интероп с js. Сам js тут вообще не причем
источник

SO

Shagen Ogandzhanian in Kotlin JS
Я оставлю тут минимальный пример - может кому-то пригодится
делаем раз
@JsModule("something")
external fun callAsFunction(param: Int)

@JsModule("something")
external class InstantiateAsClass(param: String)


делаем два
fun main() {
   callAsFunction(3)
   InstantiateAsClass("I AM A CLASS")
}

в сгенерённом коде видим:```
(function (_, Kotlin, $module$something) {
 'use strict';
 function main() {
   $module$something(3);
   new $module$something('I AM A CLASS');
 }
 _.main = main;
 main();
 Kotlin.defineModule('test', _);
 return _;
}(module.exports, require('kotlin'), require('something')));
`
источник

AN

Alexander Nozik in Kotlin JS
Напыщенное Эго
Самая большая проблема это интероп с js. Сам js тут вообще не причем
На самом деле сам JS, а точнее традиции написания на нем. Лично у меня с интеропом с нормальными ES6 модулями  особых сложностей не возникает. Но вот структура API, постоянный monkey patching и убитая модуляризация достают
источник

AN

Alexander Nozik in Kotlin JS
Shagen Ogandzhanian
Я оставлю тут минимальный пример - может кому-то пригодится
делаем раз
@JsModule("something")
external fun callAsFunction(param: Int)

@JsModule("something")
external class InstantiateAsClass(param: String)


делаем два
fun main() {
   callAsFunction(3)
   InstantiateAsClass("I AM A CLASS")
}

в сгенерённом коде видим:```
(function (_, Kotlin, $module$something) {
 'use strict';
 function main() {
   $module$something(3);
   new $module$something('I AM A CLASS');
 }
 _.main = main;
 main();
 Kotlin.defineModule('test', _);
 return _;
}(module.exports, require('kotlin'), require('something')));
`
Лучше сразу в документацию. По JS хорошо бы именть подборку таких вот кейсов.
источник

SO

Shagen Ogandzhanian in Kotlin JS
да, мы сделаем документацию наглядней
источник

IG

Ilya Goncharov in Kotlin JS
Добавлю, что
@JsModule("something")
external fun callAsFunction(param: Int)

@JsModule("something")
external class InstantiateAsClass(param: String)

не эквивалентно

@file:JsModule(“something”)

external fun callAsFunction(param: Int)

external class InstantiateAsClass(param: String)
источник

Н

Напыщенное Эго in Kotlin JS
Alexander Nozik
На самом деле сам JS, а точнее традиции написания на нем. Лично у меня с интеропом с нормальными ES6 модулями  особых сложностей не возникает. Но вот структура API, постоянный monkey patching и убитая модуляризация достают
холиварная тема. В зависимости от того кому что к чему нужно прикрутить... для того другая сторона и является проблемой. Вам js к котлину нужно прикрутить.. вот вам и кажется что проблема в js. Мне котлин к js нужно прикрутить.. и для меня проблема - средства интеропа котлина с js.
источник

AN

Alexander Nozik in Kotlin JS
Пока все эксперты тут, объясните мне пожалуйста, почему когда я генерирую объект как написано тут сверху: https://pastebin.com/x1WHHzE6 (этоя пытаюсь external interface реализовать), получается то, что снизу. И как с этим бороться? Везде JSName развешивать?
источник

AN

Alexander Nozik in Kotlin JS
Сделал ручную сборку объекта через JSON все заработало. Как вообще надо создавать инстансы external interface, которые dukat-ом генерируются?
источник

AN

Alexander Nozik in Kotlin JS
Нашел в официальной доке: https://kotlinlang.org/docs/reference/js-interop.html#external-interfaces. Все делается через js("{}"). Не круто!
источник

SK

Slava Kuzmich in Kotlin JS
Alexander Nozik
Пока все эксперты тут, объясните мне пожалуйста, почему когда я генерирую объект как написано тут сверху: https://pastebin.com/x1WHHzE6 (этоя пытаюсь external interface реализовать), получается то, что снизу. И как с этим бороться? Везде JSName развешивать?
Там в объекте заманглены имена приватных backing полей. Для "виртуальных" пропертей всегда генерируется get/set JS пропертя на прототипе с настоящим Kotlin именем + опционально value пропертя на объекте с замангленным именем.

При использовании пропертей напрямую, например x.id или x.itree.state, - это работает хорошо. Но во многих способах рефлексии над JS объектом прототип игнорируют, а приватные поля на объекте хорошо видны. Отсюда такой результат.

Случай неприятный, и JsName тут, к сожалению, не поможет. Думаем над тем, как это решать. Возможно что-то вроде аннотации JvmField, но которая поддерживает override и не поддерживает super доступ.

Пока можно использовать kotlin.js.Json или делать проперти финальными без get/set и override.
источник

AN

Alexander Nozik in Kotlin JS
Slava Kuzmich
Там в объекте заманглены имена приватных backing полей. Для "виртуальных" пропертей всегда генерируется get/set JS пропертя на прототипе с настоящим Kotlin именем + опционально value пропертя на объекте с замангленным именем.

При использовании пропертей напрямую, например x.id или x.itree.state, - это работает хорошо. Но во многих способах рефлексии над JS объектом прототип игнорируют, а приватные поля на объекте хорошо видны. Отсюда такой результат.

Случай неприятный, и JsName тут, к сожалению, не поможет. Думаем над тем, как это решать. Возможно что-то вроде аннотации JvmField, но которая поддерживает override и не поддерживает super доступ.

Пока можно использовать kotlin.js.Json или делать проперти финальными без get/set и override.
Может быть это можно решить на стороне dukat и сделать к генераторы для таких external iterface, который не будет использовать явный конструктор.
источник

AN

Alexander Nozik in Kotlin JS
В DataForge я это решаю тем, что вообще не транслирую динамику в JS класс, а делаю делегаты над динамическим объектом
источник

Н

Напыщенное Эго in Kotlin JS
Alexander Nozik
Может быть это можно решить на стороне dukat и сделать к генераторы для таких external iterface, который не будет использовать явный конструктор.
dukat - это про конвертацию тайпингов. он тут не причем. проблема в том какие проперти генерит бэкэнд k/js
источник

Н

Напыщенное Эго in Kotlin JS
страдаю из-за этого с самого начала пользования k/js
источник

AN

Alexander Nozik in Kotlin JS
Напыщенное Эго
dukat - это про конвертацию тайпингов. он тут не причем. проблема в том какие проперти генерит бэкэнд k/js
Проблема именно в том, что дукат генерит, потому что мы хотим, чтобы можно было эти байндинги генерить с минимальной доработкой. Остальные косяки не такие срочные.
источник

AN

Alexander Nozik in Kotlin JS
Как только байндинги работают, про то, что там манглится, вообще можно не думать
источник