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





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