Как преобразовать 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 по своей сути небезопасен, здесь есть небольшой компромисс безопасности, но я думаю, что подойдет самый простой вариант.

Другие вопросы по тегам