Kotlin: оператор распространения при вызове метода JavaScript - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь написать безопасную для типов оболочку для библиотеки 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 Ответ

0 голосов
/ 17 января 2019

Использование external fun с @JsModule аннотация

@JsModule("library")
external fun method(vararg args: String): LibraryMethodReturnType

Это сделает require("library") для вас под капотом. У вас будут правильные котлинские типы вместо dynamic сразу. У вас не будет «оболочек», что означает отсутствие дополнительных вызовов JavaScript во время выполнения.


Существует хакерское решение, если вы хотите вручную использовать типы require и dynamic: используйте метод apply для передачи всех аргументов в виде массива.

val jsLibrary: dynamic = require("library")
fun method(vararg args: String) = jsLibrary.method.apply(null, args)
...