Поддерживают ли поля GraphQL полиморфизм на основе переданных в аргументах?

#graphql #graphql-js

#graphql #graphql-js

Вопрос:

Я хотел бы определить следующие запросы

 {
// return all individuals
individuals {
    id
  }
}

// return ONE individual by id
individuals(id:"123") {
   id
  }
}
  

обратите внимание, что имя запроса одно и то же, отличаются только параметры.

На сегодняшний день единственное решение, которое я нашел, — это определить разные имена запросов.

Как я могу определить полиморфные запросы? Возможно ли это вообще?

Комментарии:

1. Я не уверен, что вы подразумеваете здесь под «именем запроса» — вы имеете в виду имя поля в корневом типе запроса?

2. Это объясняется здесь graphql.org/learn/queries В приведенных выше примерах имя запроса — «individuals»

Ответ №1:

Поля, доступные в корне вашего запроса GraphQL, определены в схеме GraphQL как поля корневого типа запроса, обычно с простым именем Query . Этот тип точно такой же, как и любой другой тип объекта GraphQL в схеме. Итак, этот вопрос можно сформулировать как:

Имеют ли поля GraphQL возможность возвращать разные результаты на основе переданных в аргументах или типах аргументов?

Короткий ответ «нет». Одним из важных свойств GraphQL является то, что конкретное поле всегда должно возвращать один и тот же тип; это означает, что поле, возвращающее массив, всегда должно возвращать массив, а поле, возвращающее тип объекта, всегда должно возвращать этот конкретный тип, независимо от передаваемых аргументов.

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

  1. Поля GraphQL могут иметь необязательные аргументы. Так, например, если у вас есть поле с именем individuals , вы могли бы использовать необязательные аргументы для предоставления различных типов фильтров, например: individuals(search: "Dan") или individuals(status: "admin") , или individuals (без аргументов) или individuals(status: "admin", search: "Dan") (оба аргумента предоставляются сразу.
  2. Поля GraphQL могут возвращать объединение нескольких типов объектов. Итак, если ваше поле может возвращать несколько разных типов данных, вы можете использовать объединение. Это представлено в примере SearchResult в документах: http://graphql.org/learn/schema/#union-types К сожалению, это здесь неприменимо, поскольку вы не можете объединить массив с типом объекта.

Однако во многих случаях вам потребуется создать несколько полей, поскольку в настоящее время в GraphQL нет перегрузки методов или полиморфизма.

Комментарии:

1. Для элемента с помощью id я возвращаю массив 1 , без id , array of n . Кажется, работает хорошо.