scala.js - js.Dictionary 是 "Map" 的正确类型

scala.js - is js.Dictionary the right type for a "Map"

我正在将 Twilio 视频 javascript API 与 scala.js 一起使用,例如对话 API:https://media.twiliocdn.com/sdk/js/conversations/releases/0.13.9/docs/Conversation.html

API 使用 javascript "Map" 对象(它使用 javascript 代码创建它们,如 new Map()。)

我能够在我的 scala.js 对象中使用它的唯一方法是使用 js.Dictionary,例如:

@js.native
class TwilioConversation extends js.Object {

  var participants: js.Dictionary[TwilioParticipant] = js.native

这是为 "Map" 建模的正确类型吗?还是有更好的类型? 当我尝试使用 scala Map/mutable.Map 时,它因 class 转换异常而失败。

不完全是正确的类型。正确的类型应该是 js.Map,但目前它还不存在。它仍然存在于 https://github.com/scala-js/scala-js/pull/2110/files#diff-4937cb9b8e89d2f21babe311012e63a1

的正在进行的 PR 中

在它变成 Scala.js 之前,你有两个选择:

  • 像您一样使用 js.Dictionary,只要您需要做的就是使用字符串键和 get/set 值(因为 public API 这些操作对于字典和地图是相同的)。
  • 在你的代码库中定义一个 JSMap,像这样:(灵感来自上面链接的 PR 但没有引用 IterableIterator 部分):
import scala.scalajs.js
import js.annotation._

@js.native
@JSName("Map")
class JSMap[K, V] extends js.Object {
  def size: Int = js.native

  def clear(): Unit = js.native

  def has(key: K): Boolean = js.native

  def get(key: K): js.UndefOr[V] = js.native

  def set(key: K, value: V): this.type = js.native

  def delete(key: K): Boolean = js.native
}