如何将JS代码转换为Kotlin而不使用“新”关键字
我正在考虑转换一些基本的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
对不起,但你标记为正确的答案实际上是不正确的。 我必须告诉你,因为正在寻找正确答案的人会找到它并写出不正确的代码。 一般来说,你不应该直接从Kotlin调用require
函数。 相反,你应该使用@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
编译器标志。 请参阅相应的文档页面以获取完整描
Kotlin中的require函数与您的JS代码中可能使用的NodeJS中的require不一样。
无论你的FCM类是什么,只是实例化它没有new
关键字。
感谢来自@Claies的提示,我管理它使用 js(...)
wrap。~~~
val FCM = require("fcm-push") val serverKey = "YOURSERVERKEYHERE" val fcm = js("new FCM(serverKey)") ... fcm.send(message) // now works
我不确定我是否完全满意于在kotlin中写一个字符串纯js,所以我希望有一个更好的方法,我错过了。
编辑:上面的作品,但其不理想,参考接受的答案更好地实施