Kotlin JS не добавляет новое ключевое слово там, где это необходимо

Я создаю интерактивную инфографику с помощью Google Charts и Kotlin JS. Это фрагмент с страницы быстрого запуска.

var data = new google.visualization.DataTable();
<..>
var chart = new google.visualization.PieChart(document.getElementById('chart_div'));

Здесь используется «новое» ключевое слово. Я попытался переписать этот код с помощью Kotlin.

val data = google.visualization.DataTable();
<..>
val chart = google.visualization.PieChart(document.getElementById('chart_div'));

Но произошла ошибка, говорящая о том, что ключевое слово «новое» отсутствует в строках выше. Таким образом, компилятор Kotlin для JS не добавил ключевое слово там, где оно должно быть. Вот скомпилированный код JavaScript.

var data = google.visualization.DataTable();
<..>
var chart =  google.visualization.PieChart(document.getElementById('chart_div'));

Есть ли правильный способ избежать ошибки без использования функции js()?

Спасибо.


person FoRRestDp    schedule 09.11.2019    source источник
comment
Не могли бы вы также поделиться кодом javascript, скомпилированным из этих строк kotlin?   -  person Ilya    schedule 10.11.2019
comment
@Илья Хорошо, сделал это.   -  person FoRRestDp    schedule 10.11.2019
comment
Если я читаю этот поток правильно, похоже, вам все равно нужно использовать функцию js для создания всех собственных объектов Javascript. Вы принципиально избегаете js или видели, что этот тип вызова работает без функции js в другом месте?   -  person Jeff Bowman    schedule 10.11.2019
comment
Создание JS-объекта @JeffBowman работает правильно при использовании таким образом: val request = XMLHttpRequest(...) компилируется в var request = new XMLHttpRequest(...)   -  person FoRRestDp    schedule 10.11.2019
comment
Я предполагаю, что это потому, что функция JavaScript может быть вызвана с new и без него, что означает очень разные вещи, и KT не знает, что вы имеете в виду.   -  person Aluan Haddad    schedule 10.11.2019
comment
@ЕгорПономарёв Да, но это Класс Kotlin, а не произвольное выражение (google.visualization.DataTable); насколько известно Котлину, возможно, DataTable — это простая функция. Возможно, вам нужны соответствующие external class заголовки как это делает XMLHttpRequest, но даже тогда неясно, будет ли он работать со встроенным пространством имен google.visualization.   -  person Jeff Bowman    schedule 10.11.2019


Ответы (1)


Причина, по которой ключевое слово new не было добавлено, заключается в том, что переменная google не была добавлена ​​с ключевым словом external. С этим Kotlin генерирует правильный код.

external object google {
    object visualization {
        class DataTable
    }
}
person FoRRestDp    schedule 12.11.2019