如何将 Js.Json.t 转换为 Js.t('a)?
How to convert Js.Json.t to Js.t('a)?
我已经通过 bs-json 编码了一个对象,并希望使用 bs-axios 通过 post 将其作为数据发送。
33 │ let createTest = (p: Data.toBuyListItem) => inst->Instance.postData("/
test", p |> Data.encodeToBuyListItem);
...
This has type:
Js.Json.t (defined as Js.Json.t)
But somewhere wanted:
Js.t('a)
p |> Data.encodeToBuyListItem
是红色的。如何使用 Js.Json.t
值作为 post 请求的数据?
编辑:
好吧,这行得通:
let createTest = (p: Data.toBuyListItem) => inst->Instance.postData("/test", [%raw "p"]);
但我更喜欢一个非 hacky 解决方案(最好使用 bs-json,因为我用它来解码 JSON)...
无法安全地将 Js.Json.t
转换为 Js.t
,因为后者表示 JavaScript 对象,而 JSON 不只是表示对象。但是 bs-axios
似乎把安全抛出了 window 无论如何,所以你可以不安全地转换它:
external jsonToObjects : Js.Json.t => Js.t({..}) = "%identity";
%identity
是一种通用机制,可用于在任意两种类型之间进行强制转换,因此就输入而言,这是不安全的。您基本上是在说 "Look away while I swap these things around and trust me, I know what I'm doing"。所以一定要这样做。
另一种方法是直接创建一个 Js.t
对象。 Reason 有内置的语法,所以很简单:
let obj = {
"data": someData
};
someData
可以是任何值,甚至是 Js.Json.t
值,但这也意味着您可以传入不可序列化的值,Js.Json.t
可以保护您免受这些值的影响。
考虑到 bs-axios
API 本质上是不安全的,所以这里有一个小的安全权衡,但我认为最简单的一个就可以了。
我已经通过 bs-json 编码了一个对象,并希望使用 bs-axios 通过 post 将其作为数据发送。
33 │ let createTest = (p: Data.toBuyListItem) => inst->Instance.postData("/
test", p |> Data.encodeToBuyListItem);
...
This has type:
Js.Json.t (defined as Js.Json.t)
But somewhere wanted:
Js.t('a)
p |> Data.encodeToBuyListItem
是红色的。如何使用 Js.Json.t
值作为 post 请求的数据?
编辑:
好吧,这行得通:
let createTest = (p: Data.toBuyListItem) => inst->Instance.postData("/test", [%raw "p"]);
但我更喜欢一个非 hacky 解决方案(最好使用 bs-json,因为我用它来解码 JSON)...
无法安全地将 Js.Json.t
转换为 Js.t
,因为后者表示 JavaScript 对象,而 JSON 不只是表示对象。但是 bs-axios
似乎把安全抛出了 window 无论如何,所以你可以不安全地转换它:
external jsonToObjects : Js.Json.t => Js.t({..}) = "%identity";
%identity
是一种通用机制,可用于在任意两种类型之间进行强制转换,因此就输入而言,这是不安全的。您基本上是在说 "Look away while I swap these things around and trust me, I know what I'm doing"。所以一定要这样做。
另一种方法是直接创建一个 Js.t
对象。 Reason 有内置的语法,所以很简单:
let obj = {
"data": someData
};
someData
可以是任何值,甚至是 Js.Json.t
值,但这也意味着您可以传入不可序列化的值,Js.Json.t
可以保护您免受这些值的影响。
考虑到 bs-axios
API 本质上是不安全的,所以这里有一个小的安全权衡,但我认为最简单的一个就可以了。