Не в состоянии понять сложный тип и деструктурировать его - reasonml - PullRequest
0 голосов
/ 02 апреля 2019

Я использую reason-apollo для получения данных с сервера.Он возвращает мне данные типа (vscode показывает мне этот тип):

option(
  Js.t(
    < count : int;
  rows : [ `User of
             < firstName : string; id : string; lastName : string;
               userName : string >
             Js.t
         | `Node of < id : string > Js.t ] option Js.Array.t >
  )
)

Я действительно не понимаю тип "строк", и я не могу получить данные из этого.Я пробовал это:

switch response##users {
   | None => ReasonReact.string("none")
   | Some(data) => {
      data##rows |> Array.map(optionalRow => {
         switch optionalRow {
            | None => ReasonReact.string("none")
            | Some(row) => ReasonReact.string(row##firstName);   
         }
      });
      ReasonReact.string("test");
   }
};

, но ошибка следующая:

This has type:
  array(option(Js.t(({.. firstName: string} as 'a)))) =>
  array(ReasonReact.reactElement)
But somewhere wanted:
  Js.Array.t(option([ `Node({. "id": string})
                    | `User({. "firstName": string, "id": string,
                              "lastName": string, "userName": string}) ])) =>
  'b

The incompatible parts:
  array(option(Js.t('a)))
  vs
  Js.Array.t(option([ `Node({. "id": string})
                    | `User({. "firstName": string, "id": string,
                              "lastName": string, "userName": string}) ]))
    (defined as
    array(option([ `Node({. "id": string})
                 | `User({. "firstName": string, "id": string,
                           "lastName": string, "userName": string}) ])))

  Further expanded:
    Js.t('a)
    vs
    [ `Node({. "id": string})
    | `User({. "firstName": string, "id": string, "lastName": string,
              "userName": string}) ]

Как я могу получить "firstName" из результата?

1 Ответ

0 голосов
/ 03 апреля 2019

Ааа понятно, это вариант плиморфизма, вот фрагмент, как получить firstName.

...
switch optionalRow {
   | None => ReasonReact.string("none")
   | Some(row) => {
      switch row {
         | `User(u) => ReasonReact.string(u##firstName)
         | `Node(n) => ReasonReact.string("test")
      };
      ReasonReact.string("test");
   }
}
...
...