Моделирование внешних объектов JS - PullRequest
0 голосов
/ 09 сентября 2018

PixiJS (точнее, Resource Loader ) возвращает объект JS, имеющий такую ​​форму, в обратном вызове функции загрузки:

{
    "resource-you-asked-for.png": {
        url: "foo.png",
        error: <optional error>,
        data: <binary data>
    },
    "second-resource.png": { ... }
}

Мой вопрос ... как мне смоделировать это в Kotlin.js? Я не могу просто сказать, что это Map<String, LoaderResult> - тогда Котлин попытается использовать get (искаженный get на самом деле) для индексации в нем. И я не могу подкласс dynamic очевидно.

Предложения

1 Ответ

0 голосов
/ 01 октября 2018

JavaScript-объект, который действует как карта, может использоваться в Kotlin как внешний интерфейс с расширением get и set операторные функции:

external interface ResourceDictionary

inline operator fun ResourceDictionary.get(name: String): LoaderResult? =
    this.asDynamic()[name]

inline operator fun ResourceDictionary.set(name: String, result: LoaderResult?) {
    this.asDynamic()[name] = result
}

Объект JavaScript, который действует как класс, будет использоваться в Kotlin как внешний класс

external open class LoaderResult {
   var url: String
   var data: ByteArray
   var error: Error?
}

Вы также можете конвертировать определения TypeScript, используя ts2kt tool:

  1. $ npm install -g ts2kt
  2. Найти index.d.ts файл для PixiJS
  3. $ ts2kt index.d.ts

Тогда вы сможете найти external interface ResourceDictionary и external open class Resource в pixi.PIXI.loaders.kt:

...