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)
Другие вопросы по тегам