首页 > 解决方案 > 建模外部 JS 对象

问题描述

PixiJS(或者更确切地说,Resource Loader),在 load 函数的回调中返回一个形状像这样的 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而且我显然不能继承。

建议?

标签: kotlinkotlin-js-interop

解决方案


像 Map 一样的 JavaScript 对象可以在 Kotlin 中用作具有扩展和操作符函数的外部接口: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 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 ResourceDictionaryand external open class Resourcein pixi.PIXI.loaders.kt


推荐阅读