如何在没有'new'关键字的情况下将JS代码转换为Kotlin

时间:2017-09-16 06:00:34

标签: javascript firebase kotlin firebase-cloud-messaging

我正在考虑将一些基本的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

3 个答案:

答案 0 :(得分:2)

很抱歉,但您标记为正确的答案实际上是不正确的。我必须告诉你,因为正在寻找正确答案的人会找到并编写错误的代码。通常,您不应直接从Kotlin调用require函数。相反,您应该将@JsModuleexternal声明一起使用。在您的特定情况下,它将是这样的:

@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编译器标志。有关完整说明,请参阅corresponding documentation page

答案 1 :(得分:1)

require function in Kotlin与您的JS代码中可能使用的require in NodeJS不同。

无论您的FCM类是什么,只需在没有new关键字的情况下对其进行实例化。

答案 2 :(得分:1)

感谢来自@Claies的提示,我设法使用js(...)换行使其工作。~~~

val FCM = require("fcm-push")
val serverKey = "YOURSERVERKEYHERE"
val fcm = js("new FCM(serverKey)")
...
fcm.send(message) // now works

我不确定我对在kotlin中写一个字符串中的纯js感到非常满意,所以我希望有一个更好的方法,我错过了。

编辑:上述工作,但不理想,请参考接受的答案,以便更好地实施