建模外部JS对象

时间:2018-09-09 17:44:44

标签: kotlin kotlin-js-interop

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>,然后Kotlin会尝试使用get(实际上是一个经过伪装的get)对其进行索引。而且我显然不能继承dynamic

建议?

1 个答案:

答案 0 :(得分:0)

像Map一样的JavaScript对象可以在Kotlin中以external interface的形式使用,扩展名为getset运算符:

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 class

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

您还可以使用ts2kt工具转换TypeScript定义:

  1. $ npm install -g ts2kt
  2. 找到PixiJS的index.d.ts文件
  3. $ ts2kt index.d.ts

然后您将能够在external interface ResourceDictionary中找到external open class Resourcepixi.PIXI.loaders.kt