У меня есть ситуация, когда я иногда хочу запросить список из множества объектов с несколькими полями, а иногда только один объект с множеством полей. В качестве примера рассмотрим эти два запроса:
Запрос с множеством объектов и несколькими полями:
query {
object(many=true) {
id
name
}
}
Запрос с одним объектом и множеством полей:
query {
object(many=false) {
id
... (many other fields)
}
}
Я не хочу запрашивать больше полей, чем необходимо в первом запросе, потому что это приведет к запросам с большим количеством данных (в противном случае я мог бы сделать поля идентичными, например, используя fragment, решив мою проблему).
Проблема заключается в следующем: данные, хранящиеся в кэше, нормализуются и хранятся в соответствии с __typename и id. Это означает, что запросы или атомы запросов будут перезаписывать друг друга, если они одинаковы. Следовательно, если второй запрос выполняется последним, элемент в базе данных не имеет поля name, необходимого для компонентов, связанных с первым запросом.
Самое простое решение - просто запросить name во втором запросе. Проблема в том, что это кажется хрупким и подверженным ошибкам; например, можно создать третий запрос и забыть спросить там name.
Другой вариант - сделать их разными __typename, то есть дифференцировать их на бэкэнде. Но это кажется искусственным; запросы в действительности имеют дело с одним и тем же типом объекта.
Есть ли канонический способ решения этой проблемы?


Для всех, кто попадает сюда: оказывается, что, по крайней мере, в текущей версии (@ apollo / client 3.3.6) данные объединены, так что это не проблема.