Использование кода Kotlin, перенесенного на JavaScript в проекте Angular / на стороне клиента

#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;
};