Ошибка типа при обработке результата graphql

Я только начал играть с 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 (ответ ## совпадает); и получил вот такое в приставке
Ошибка типа при обработке результата graphql

нет идентификатора в запросе?

xadm 16.09.2018 11:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
121
1

Ответы 1

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

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

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

Я нигде не использую Belt, я добавил значение Js.log к вопросу, чтобы показать, каков результат запроса graphql.

jwesonga 18.09.2018 20:05

Результат запроса не имеет значения (по крайней мере, на данном этапе). Это ошибка типа, а не ошибка времени выполнения. Вы открываете какие-либо другие модули в этом файле?

glennsl 18.09.2018 22:16

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