Kotlin: оператор распространения при вызове метода JavaScript
Я пытаюсь написать безопасную для типов оболочку для библиотеки JavaScript. Мне нужно вызвать метод из JavaScript с переменными аргументами (например, method(args...)
). Забава Kotlin для этого также должна работать с переменными аргументами. Поскольку Kotlin поддерживает оператор распространения, я пытался использовать его, но Kotlin не хочет этого.
Пример кода:
val jsLibrary: dynamic = require("library") // library given by node's require here
fun method(vararg args: String) = jsLibrary.method(*args)
Редактировать: забыл написать оператор распространения * в коде уже. Компилятор возвращает ошибку из-за оператора распространения.
Компилятор Kotlin возвращает ошибку "Не удается применить оператор распространения в динамическом вызове".
Любые идеи, как реализовать обертку, как это, или мне нужен обходной путь?
Спасибо за вашу помощь!
1 ответ
Использование external fun
с @JsModule
аннотирование
@JsModule("library")
external fun method(vararg args: String): LibraryMethodReturnType
Это будет делать require("library")
для тебя под капотом. Вы будете иметь правильные типы Kotlin вместо dynamic
сразу. У вас не будет никаких "оболочек", что означает отсутствие дополнительных вызовов JavaScript во время выполнения.
Существует хакерское решение, если вы хотите использовать вручную require
а также dynamic
типы: использование apply
метод для передачи всех аргументов в виде массива.
val jsLibrary: dynamic = require("library")
fun method(vararg args: String) = jsLibrary.method.apply(null, args)