怎么把Js.Json.t转换成Js.t('a)?

时间:2020-02-09 14:23:26

标签: reason bucklescript bs-json

我已经通过bs-json对对象进行了编码,并希望使用bs-axios通过发布将其作为数据发送。

  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值用作发布请求的数据?

编辑:

嗯,这可行:

let createTest = (p: Data.toBuyListItem) => inst->Instance.postData("/test", [%raw "p"]);

但是我更喜欢一个非hacky的解决方案(最好使用bs-json,因为我正在使用它来解码JSON)...

1 个答案:

答案 0 :(得分:0)

无法安全地将Js.Json.t转换为Js.t,因为后者代表JavaScript对象,而JSON不仅代表对象。但是bs-axios似乎仍然将安全性丢到了窗外,因此您可以不安全地对其进行投射:

external jsonToObjects : Js.Json.t => Js.t({..}) = "%identity";

%identity是一种通用机制,可用于在任何两种类型之间进行转换,因此就键入而言,这是不安全的。您基本上是说“当我交换这些东西并相信我时,请别走,我知道我在做什么”。因此,请确保您这样做。

另一种选择是直接创建Js.t对象。 Reason具有内置语法,因此非常简单:

let obj = {
  "data": someData
};

someData可以是任何值,甚至可以是Js.Json.t值,但这也意味着您可以传递不可序列化的值,Js.Json.t可以保护您。

>

鉴于bs-axios API本质上是不安全的,因此这里需要进行一些安全的权衡,但是我认为最简单的一个都可以。

相关问题