javascript - 在 Angular/客户端项目中使用转换为 JavaScript 的 Kotlin 代码
问题描述
我们有一个 Kotlin 项目,其中一些类旨在与客户端共享,因此我们配置了kotlin-maven-plugin
将某些 Kotlin 类作为 JavaScript 输出:
<configuration>
<outputFile>${project.basedir}/angular/src/assets/kotlin_classes.js</outputFile>
<moduleKind>commonjs</moduleKind>
</configuration>
使用如下所示的 Kotlin 类:
class SomeKotlinClass {
fun someMethod(name: String): String {
return "Happy Birthday, " + name;
}
}
我们遇到的问题是,无论moduleKind
我们使用什么(我们尝试过plain
, umd
, amd
),我们的方法名称在 JavaScript 文件中似乎都有一个奇怪/乱码的后缀:
SomeKotlinClass.prototype.someMethod_6q3v0v$ = function (name) {
return 'Happy Birthday, ' + name
};
这意味着我们在 Angular/TypeScript 中的调用不能是 to someMethod()
,它们必须是 to someMethod_6q3v0v$()
,这对我们不起作用。
我的插件配置有问题,还是我在项目中包含这个 JavaScript 文件的方式有问题?我们已经完成了 99% 的工作,但最后一个(奇怪的)障碍阻碍了我们。
解决方案
Javascript中编译方法的名称可以使用@JSName(...)
注解来设置。
在这种情况下:
class SomeKotlinClass {
@JsName("someMethod")
fun someMethod(name: String): String {
return "Happy Birthday, " + name;
}
}
然后编译为:
SomeKotlinClass.prototype.someMethod = function (name) {
return 'Happy Birthday, ' + name;
};
推荐阅读
- sqlmap - SQLMAP 缺少一个或多个核心扩展('gzip'、'ssl'、'sqlite3'、'zlib')
- c# - 如何在制作 zip 文件之前将文件内容制作为 base64 编码
- android - Android Espresso 未与 Rx Completable 同步
- sqlite - 如何从 sqlite3 的子表中删除子行?
- c# - 如何使用 NEST 进行过滤聚合?
- mongodb - Spring data mongo - 获取mongo中对象数组的总和
- antd - Antd,Form,无标签,但我想显示所需的红色标记
- java - 嵌套杰克逊序列化
- python - 在 Django3 中生成 pdf 时出现 405 错误
- c++ - 如果线程在 C++ 中阻塞,则强制程序终止