Reason React и Graphql обрабатывают значения ENUM - PullRequest
3 голосов
/ 11 июля 2019

Только начал изучать причину реакции и бороться с настройкой graphql, пытающейся прочитать значение ENUM.

setup

  • причина реакции
  • apollo graphql
  • graphql_ppx
  • конечная точка github graphql

Я получаю последние данные запроса на получение по github api и считываю свойство status, котороеперечисление и определяется в gql документах как:

  • ОТКРЫТО
  • ЗАКРЫТО
  • ОБЪЕДИНЕНО

проверка вкладки сети, я вижусостояния принимаются в виде строк.внутри приложения, когда я регистрирую поле, я получаю целые числа, отражающие значения.Может ли кто-нибудь объяснить мне, как я могу «напечатать» данные в виде строки на мой взгляд и почему они переводятся в целые числа?есть ли где-нибудь сгенерированный тип, который я мог бы использовать для переключения вариантов?

let stateEnum = data->map(node => node##state);
Js.log(stateEnum) // possible values: 880069578, 982149804 or -1059826260
// somehow switch these values here?! :)
// current type of `stateEnum` is option('a)

Заранее большое спасибо и хорошего дня!

Ответы [ 2 ]

4 голосов
/ 12 июля 2019

Перечисления GraphQL представлены как полиморфные варианты Reason. Под капотом во время выполнения они просто целые числа. Если вы хотите отобразить их пользователю, у вас есть два варианта: 1. Отобразите их в строку вручную, используя переключатель

let status = 
  switch(node#status) {
    | `OPEN => “Open”
    // other cases
  }
  1. Вы можете использовать функциональность BuckleScript для генерации jsConverters:
[@bs.deriving jsConverter]
type status = [ |`OPEN | `CLOSED /* other cases */]

это сгенерирует две функции для вас: statusToJs и statusFromJs. Они помогают вам преобразовать вариант в строку и из строки.

Вот документация BuckleScript об этом: https://bucklescript.github.io/docs/en/generate-converters-accessors#convert-between-js-string-enum-and-bs-polymorphic-variant

1 голос
/ 12 июля 2019

Как отметил @Herku в своем комментарии, ключ был просто сделать это:

// asume that your enum is on a gqp property called `state`
// and we use the built in lib `Belt.Option` and the fn `getWithDefault`
// this way we are sure, that `stateEnum` is defined with one of the valid enum values
let stateEnum = data->map(node => node##state)->getWithDefault(`OPEN);

// next we switch the polimorphic variant
let state = switch(stateEnum) {
 | `OPEN => "open"
 | `CLOSED => "close"
 | `MERGED` => "merged"
}

// str = let str = ReasonReact.string;
str(state);
...