J'ai encodé un objet via bs-json et je souhaite l'envoyer sous forme de données via la poste à l'aide de 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 est rouge. Comment utiliser la valeur Js.Json.t comme données pour une demande de publication ?

Éditer:

Eh bien, cela fonctionne:

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

Mais je préférerais une solution non piratée (de préférence en utilisant bs-json, puisque je l'utilise pour décoder JSON)...

1
menfon 9 févr. 2020 à 17:23

1 réponse

Meilleure réponse

Il n'y a aucun moyen de convertir en toute sécurité un Js.Json.t en Js.t, car ce dernier représente un objet JavaScript et JSON ne représente pas seulement des objets. Mais bs-axios semble de toute façon jeter la sécurité par la fenêtre, vous pouvez donc simplement la lancer de manière dangereuse :

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

%identity est un mécanisme général qui peut être utilisé pour effectuer un transtypage entre deux types, ce qui est aussi dangereux que possible en ce qui concerne la frappe. Vous dites essentiellement "Regardez ailleurs pendant que j'échange ces choses et faites-moi confiance, je sais ce que je fais". Alors assurez-vous de le faire.

Une autre alternative consiste à créer directement un objet Js.t. Reason a une syntaxe intégrée pour cela, donc c'est assez simple :

let obj = {
  "data": someData
};

someData ici peut être n'importe quelle valeur, même une valeur Js.Json.t, mais cela signifie également que vous pouvez transmettre des valeurs qui ne sont pas sérialisables, contre lesquelles Js.Json.t vous protège.

Étant donné que l'API bs-axios est intrinsèquement dangereuse, il y a un compromis de sécurité mineur ici, mais je pense que le plus simple conviendra.

0
glennsl 9 févr. 2020 à 15:45