Я изучаю преобразование некоторых базовых JS в Kotlin, но я зациклился на new
ключевом слове. Я не уверен, как преобразовать следующий JS в Kotlin
var FCM = require('fcm-node'); var fcm = new FCM('YOURSERVERKEYHERE'); var message = { ... }; fcm.send(message, function(err, response){ ... }
Я пытался
fun sendTestPush() { val FCM = require("fcm-push") val fcm = new FCM("YOURSERVERKEYHERE") val data = Data("Title", "Message") val message = Message("registration_id", data) fcm.send(message) } data class Message(val to: String, val data: Data) data class Data(val title: String, val message: String)
Я получаю ошибку компиляции. Unresolved reference: new
поскольку у Kotlin ее нет. Без «нового» я получаю ожидаемую ошибку. Attempting to TypeError: Cannot read property 'send' of undefined
Любая идея обойти эту проблему?
Изменить: FCM-класс – пакет npm https://www.npmjs.com/package/fcm-push
Извините, но ваш ответ, который вы отметили как правильный, на самом деле неверен. Я должен сказать это, так как тот, кто ищет правильный ответ, найдет его и напишет неправильный код. Как правило, вы не должны require
функцию непосредственно из Kotlin. Скорее, вы должны использовать @JsModule
вместе с external
объявлениями. В вашем конкретном случае это будет примерно так:
@JsModule("fcm-push") external class FCM(serverKey: String) { fun send(message: Any?, callback: (err: Any?, response: Any?) -> Unit) fun send(message: Any?): Promise<Any> } val serverKey = "YOURSERVERKEYHERE" val fcm = FCM(serverKey) //... fcm.send(message)
Кроме того, вы должны передать commonjs
moduleKind
компилятора moduleKind
. См. Соответствующую страницу документации для полного описания.
Функция потребности в Kotlin не такая же, как требование в NodeJS, которое, вероятно, используется в вашем JS-коде.
Независимо от вашего класса FCM, просто создайте его без new
ключевого слова.
Благодаря подсказке @Claies мне удалось заставить ее работать с помощью обертки js(...)
. ~~~
val FCM = require("fcm-push") val serverKey = "YOURSERVERKEYHERE" val fcm = js("new FCM(serverKey)") ... fcm.send(message) // now works
Я не уверен, что полностью доволен написанием чистых js внутри строки в kotlin, поэтому я надеюсь, что есть лучший способ, который я пропустил.
Редактировать: вышеупомянутые работы, но не идеальные, относятся к принятому ответу для лучшей реализации