PixiJS (или, скорее, Загрузчик ресурсов) возвращает объект JS, имеющий такую форму в обратном вызове функции загрузки:
{
"resource-you-asked-for.png": {
url: "foo.png",
error: <optional error>,
data: <binary data>
},
"second-resource.png": { ... }
}
У меня вопрос ... как мне смоделировать это в Kotlin.js? Я не могу просто сказать, что это Map<String, LoaderResult>
- тогда Kotlin попытается использовать get
(на самом деле искаженный get
), чтобы проиндексировать его. И я, очевидно, не могу создать подкласс dynamic
.
Предложения?
Объект JavaScript, который действует как Map, можно использовать в 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:
$ npm install -g ts2kt
$ ts2kt index.d.ts
Тогда вы сможете найти external interface ResourceDictionary
и external open class Resource
в pixi.PIXI.loaders.kt
: