Ошибка при обработке результата 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(ответ ## соответствует); и получил это в консоли
1 ответ
Я уверен, что здесь не хватает некоторого контекста, и что у вас есть что-то вроде open Belt
в верхней части вашего файла.
Ошибка типа говорит response##matches
является array
в option
но также и то, что сами элементы массива находятся в option
с, что супер странно. Так что моя теория заключается в том, что код, сгенерированный graphql-ppx
использует что-то вроде индексации массива, что переводится как вызов Array.get
что в стандартной библиотеке выдает исключение, если выходит за пределы, но в Belt
и многие другие замены стандартных библиотек, возвращает option
,
Это одна из многих проблем с использованием ppx
s. Он генерирует код не изолированно и может странным образом взаимодействовать с остальным кодом, а его отладку нелегко.