Ошибка типа при обработке результата graphql - PullRequest
0 голосов
/ 15 сентября 2018

Я только начал играть с reasonML и graphql и создал простой компонент реагирования, который извлекает данные из API чемпионата мира.Мой код ниже:

[@bs.module] external gql: ReasonApolloTypes.gql = "graphql-tag";

module GetMatches = [%graphql
  {|
    query getMatches($id: ID!){
        matches(id: $id) {
            date
            homeTeam {name}
            awayTeam {name}
            homeScore
            awayScore
            goals {
              scorer {
                name
              }
              time
            }
          }
    }
  |}
];

module GetMatchesQuery = ReasonApollo.CreateQuery(GetMatches);

let component = ReasonReact.statelessComponent("Matches");

let make = _children => {
  ...component,
  render: _self => {
    let matchParam = GetMatches.make(~id="300331511", ());
    <GetMatchesQuery variables=matchParam##variables>
      ...{
           ({result}) =>
             switch (result) {
             | Loading => <div> {ReasonReact.string("Loading")} </div>
             | Error(error) =>
               <div> {ReasonReact.string(error##message)} </div>
             | Data(response) => <Matches matches=response##matches />
             }
         }
    </GetMatchesQuery>;
  },
};

Компоненты соответствий

let component = ReasonReact.statelessComponent("Matches");

let make = (~matches, _children) => {
  ...component,
  render: _self =>
    <div>
      {
        matches
        |> Js.Array.map(match => <Match match key=match##id />)
        |> ReasonReact.array
      }
    </div>,
};

Но я получаю эту ошибку:

This has type:
    option(Js.Array.t(option({. "awayScore": option(int),
                               "awayTeam": option({. "name": option(string)}),
                               "date": option(string),
                               "goals": option(Js.Array.t(option({. "scorer": 
                                                                   option(
                                                                   {. "name": 
                                                                    option(
                                                                    string)}),
                                                                   "time": 
                                                                   option(
                                                                   string)}))),
                               "homeScore": option(int),
                               "homeTeam": option({. "name": option(string)})})))
  But somewhere wanted:
    Js.Array.t(Js.t(({.. id: string} as 'a))) (defined as array(Js.t('a)))

Я добавил Js.log (response ##Матчи);и получил это в консоли
Js.log

1 Ответ

0 голосов
/ 16 сентября 2018

Я почти уверен, что здесь не хватает некоторого контекста, и что у вас есть что-то вроде open Belt вверху вашего файла.

Ошибка типа говорит, что response##matches - это array вoption, но также и то, что сами элементы массива находятся в option с, что очень странно.Итак, моя теория состоит в том, что код, сгенерированный graphql-ppx, использует что-то вроде индексации массива, что переводит к вызову Array.get, который в стандартной библиотеке выдает исключение, если выходит за пределы, но в Belt, и во многих других стандартныхзамены библиотек, возвращает option.

Это одна из многих проблем с использованием ppx s.Он генерирует код не изолированно и может странным образом взаимодействовать с остальным кодом, а его отладку нелегко.

...