Для решения этой проблемы я нашел интересный подход, основанный на аннотации JsModule. Нам нужно создать файл Kotlin, представляющий тот модуль javascript, который мы хотим импортировать, в моем случае «apollo-server».
@file:JsModule("apollo-server")
@file:JsNonModule
package com.package
import kotlin.js.Promise
external interface ServerInfo {
var address: String
var family: String
var url: String
var subscriptionsUrl: String
var port: dynamic /* Number | String */
get() = definedExternally
set(value) = definedExternally
var subscriptionsPath: String
var server: Any
}
external open class ApolloServer(config: Any? /* ApolloServerExpressConfig & `T$0` */) : Any {
open var httpServer: Any
open var cors: Any
open var onHealthCheck: Any
open var createServerInfo: Any
open fun applyMiddleware()
open fun listen(vararg opts: Any): Promise<ServerInfo>
open fun stop(): Promise<Unit>
}
С помощью приведенного выше кода мы в основном описываем то, что ожидаем найти в модуле apollo-server и как сопоставить его с Kotlin.
В нашей основной функции Kotlin нам не нужно указывать какие-либо require (...), а просто использовать наш ApolloServer класс вроде:
ApolloServer(null).listen().then {
console.log(it)
}
При использовании этого подхода Kotlin будет правильно его переносить, используя новое ключевое слово в javascript.
Извлечение транспонированной версии:
function main$lambda(it) {
console.log(it);
return Unit;
}
function main() {
(new ApolloServer(null)).listen().then(main$lambda);
}
Этот код является только примером, ApolloServer не будет инициализирован без надлежащей конфигурации, в этом случае, например, содержится конфигурация с нулевым значением.