如何在 ReScript 中将 Js.Dict.t 转换为 Js.t?
How to convert a Js.Dict.t to Js.t in ReScript?
有没有直接的方法来转换 Js.Dict.t
这样的
Js.Dict.fromArray([
("bigKey", Js.Dict.fromArray([("smallKey", "value")]))
])
到 Js.t
喜欢这个:
{
"bigKey": {
"smallKey": "value"
}
}
在结构方面它们已经相同——都表示为 JavaScript 对象——因此从技术上讲没有必要“转换”它。尽管在结构上相同,但类型在相互排斥的方式上有所不同,因此通常无法将一个转换为另一个。
Js.Dict.t
是未知数量的键值对的同构集合,而Js.t
是固定数量的键值对的异构集合,虽然它也支持子类型化和结合类型推断,它可能看起来是动态的。
所以最简单的方法就是将其转换为“开放”对象类型,该类型将被推断为您想要的任何类型:
external dictToJsObject : Js.Dict.t(_) => Js.t({..}) = "%identity";
但要注意这里的键没有类型安全。编译器只会假设您使用它是正确的。如果您使用一个键,则假定它存在,并且来自 Js.Dict.t
的值的类型约束不会被继承并且在键之间不一致。
稍微好一点的方法是将其转换为具有已知形状的“封闭”对象类型:
external dictToJsObject : Js.Dict.t('a) => Js.t({ "foo": 'a, "bar": 'a }) = "%identity";
此处指定返回的对象具有与 Js.Dict.t
相同值类型的键 foo
和 bar
。这提供了明显更高的类型安全性,但我们仍然无法在编译时知道 foo
和 bar
键实际上存在于 Js.Dict.t
中。我们只是假设它确实如此。
因此,将 Js.Dict.t
转换为 Js.t
的唯一正确方法通常是手动进行:
let dictToJsObjec
: Js.Dict.t('a) => option({"foo": 'a, "bar" 'a})
= dict =>
switch ((Js.Dict.get(dict, "foo"), Js.Dict.get(dict, "bar"))) {
| (Some(foo), Some(bar)) => Some({
"foo": foo,
"bar": bar,
})
| _ => None
}
有没有直接的方法来转换 Js.Dict.t
这样的
Js.Dict.fromArray([
("bigKey", Js.Dict.fromArray([("smallKey", "value")]))
])
到 Js.t
喜欢这个:
{
"bigKey": {
"smallKey": "value"
}
}
在结构方面它们已经相同——都表示为 JavaScript 对象——因此从技术上讲没有必要“转换”它。尽管在结构上相同,但类型在相互排斥的方式上有所不同,因此通常无法将一个转换为另一个。
Js.Dict.t
是未知数量的键值对的同构集合,而Js.t
是固定数量的键值对的异构集合,虽然它也支持子类型化和结合类型推断,它可能看起来是动态的。
所以最简单的方法就是将其转换为“开放”对象类型,该类型将被推断为您想要的任何类型:
external dictToJsObject : Js.Dict.t(_) => Js.t({..}) = "%identity";
但要注意这里的键没有类型安全。编译器只会假设您使用它是正确的。如果您使用一个键,则假定它存在,并且来自 Js.Dict.t
的值的类型约束不会被继承并且在键之间不一致。
稍微好一点的方法是将其转换为具有已知形状的“封闭”对象类型:
external dictToJsObject : Js.Dict.t('a) => Js.t({ "foo": 'a, "bar": 'a }) = "%identity";
此处指定返回的对象具有与 Js.Dict.t
相同值类型的键 foo
和 bar
。这提供了明显更高的类型安全性,但我们仍然无法在编译时知道 foo
和 bar
键实际上存在于 Js.Dict.t
中。我们只是假设它确实如此。
因此,将 Js.Dict.t
转换为 Js.t
的唯一正确方法通常是手动进行:
let dictToJsObjec
: Js.Dict.t('a) => option({"foo": 'a, "bar" 'a})
= dict =>
switch ((Js.Dict.get(dict, "foo"), Js.Dict.get(dict, "bar"))) {
| (Some(foo), Some(bar)) => Some({
"foo": foo,
"bar": bar,
})
| _ => None
}