Моделирование внешних объектов JS

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

{
    "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 ответ

Объект 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:

  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:

Другие вопросы по тегам