Как преобразовать Js. Json .t в Js .t ('a)? - PullRequest
0 голосов
/ 09 февраля 2020

Я закодировал объект через bs- json и хочу отправить его в виде данных по почте, используя bs-ax ios.

  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 Ответ

0 голосов
/ 09 февраля 2020

Невозможно безопасно преобразовать 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 защищает вас от.

Учитывая, что API bs-axios небезопасен по своей природе, здесь есть небольшой компромисс в отношении безопасности, но я думаю, что проще всего подойдет.

...