#javascript #angular #kotlin
#javascript #angular #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% пути, но это последнее (странное) препятствие задерживает нас.
Комментарии:
1. Аннотация @JsName должна решить вашу непосредственную проблему. Однако есть много других проблем, как описано в моем сообщении в блоге о создании приложений с помощью kotlin и typescript . например: — использование типов kotlin — генерация файлов .d.ts — получение сгенерированного kotlin кода в каталог node_modules (или ресурсы) Мне было бы интересно, как вы сами решили эти проблемы?
Ответ №1:
Имя скомпилированного метода в Javascript может быть задано с помощью @JSName(...)
аннотации.
В этом случае:
class SomeKotlinClass {
@JsName("someMethod")
fun someMethod(name: String): String {
return "Happy Birthday, " name;
}
}
Который затем компилируется в:
SomeKotlinClass.prototype.someMethod = function (name) {
return 'Happy Birthday, ' name;
};