Моделирование внешних объектов 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:
$ npm install -g ts2kt
- Найти файл index.d.ts для PixiJS
$ ts2kt index.d.ts
Тогда вы сможете найти external interface ResourceDictionary
а также external open class Resource
в pixi.PIXI.loaders.kt
: