Как преобразовать Js.Json.t в Js.t ('a)?
Я закодировал объект через 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"]);
но я бы предпочел не-хакерское решение (желательно с использованием bs-json, поскольку я использую его для декодирования JSON)...
1 ответ
Невозможно безопасно преобразовать 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 по своей сути небезопасен, здесь есть небольшой компромисс безопасности, но я думаю, что подойдет самый простой вариант.