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 但没有引用 Iterable
和 Iterator
部分):
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
}
我正在将 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
在它变成 Scala.js 之前,你有两个选择:
- 像您一样使用
js.Dictionary
,只要您需要做的就是使用字符串键和 get/set 值(因为 public API 这些操作对于字典和地图是相同的)。 - 在你的代码库中定义一个
JSMap
,像这样:(灵感来自上面链接的 PR 但没有引用Iterable
和Iterator
部分):
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
}