GraphQL Relay defaultValue для массива объектов в определениях аргументов фрагмента

Я пытаюсь определить свой createRefetchContainer с помощью фрагмента. Однако я получаю сообщение об ошибке о defaultValue массива типа объекта. Я проверил документацию, но не мог понять, как обрабатывать атрибут значения по умолчанию для массива параметра типа объекта.

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

export default createRefetchContainer(
  translate('admin')(UserList),
  graphql`
    fragment UserList_usersWithPage on Query
      @argumentDefinitions(
        filters: { type: [UserFilterInput], defaultValue: [] }
        pageNumber: { type: Int, defaultValue: 0 }
        pageSize: { type: Int, defaultValue: 25 }
      ) {
      page: findUsersWithPage(filters: $filters, pageNumber: $pageNumber, pageSize: $pageSize) {
        totalPages
        totalElements
        users {
          ...MiniProfile_user @relay(mask: false)
        }
      }
    }

    fragment UserList_filterFields on Query {
      accounts: findDistinctUserAccounts
      departments: findDistinctUserDepartments
      expertises: findDistinctUserExpertises
      ranks: findAllUserRankCodes
    }
  `,
  graphql`
    query UserListRefetchQuery($userFilterInput: [UserFilterInput], $pageNumber: Int, $pageSize: Int) {
      ...UserList_usersWithPage
        @arguments(userFilterInput: $userFilterInput, pageNumber: $pageNumber, pageSize: $pageSize)
    }
  `,
);


ERROR:
GraphQLParser: Expected definition for variable `filters` to be an object 
with the following shape: `{type: string, defaultValue?: mixed, nonNull?: 
boolean, list?: boolean}`, got `[object Object]`. Source: document 
`UserList_usersWithPage` file: `scenes/admin/pages/UserList.js`. 

Избавьтесь от скобок вокруг UserFilterInput

StuffedPoblano 04.06.2019 20:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
2
1
975
1

Ответы 1

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

...
@argumentDefinitions(
  filters: { type: "[Filter!]", defaultValue: [] }
)
...

Итак, в примере OP это будет означать:

export default createRefetchContainer(
  translate('admin')(UserList),
  graphql`
    fragment UserList_usersWithPage on Query
      @argumentDefinitions(
        filters: { type: "[UserFilterInput!]", defaultValue: [] }
        pageNumber: { type: Int, defaultValue: 0 }
        pageSize: { type: Int, defaultValue: 25 }
      ) {
      ...

Обратите внимание, что пустой массив по-прежнему является допустимым типом аргумента, поскольку [Type!] допускает пустые массивы, но требует, чтобы все члены были ненулевыми типа Type.

Я все еще довольно новичок в graphql и ретрансляции, поэтому не могу вдаваться в подробности о Зачем, это работает в настоящее время.

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