Даже если вы используете apollo-client
, а не apollo-boost
, вы не должны устанавливать addTypename
в false, если у вас нет веских причин для этого.Поле __typename
используется InMemoryCache
для нормализации результатов запроса, поэтому его пропуск, вероятно, приведет к непредвиденному поведению при кэшировании.
К сожалению, для этой проблемы нет «серебряной пули».Запрос запроса и затем использование данных этого запроса в качестве переменной для другого запроса может быть истолковано как злоупотребление API.Type
, возвращаемый запросом, и Input Type
, используемые в качестве аргумента, - это совершенно разные вещи, даже если в качестве объектов Javascript они совместно используют одно или несколько полей.Точно так же, как вы не можете использовать типы и типы ввода взаимозаменяемо в схеме, не следует ожидать, что они могут использоваться взаимозаменяемо на стороне клиента.
Это также означает, что если вы окажетесь вВ этой ситуации вы можете еще раз взглянуть на свой дизайн схемы.В конце концов, если данные уже существуют на сервере, должно быть достаточно передать их идентификатор и извлечь их на стороне сервера, а не передавать весь объект.
Если выиспользуя какой-либо запрос для заполнения одного или нескольких входов, а затем используя значение этих входов внутри мутации, вы, вероятно, уже переводите исходные данные запроса в состояние компонента и затем используете их в своей мутации.В этом сценарии __typename
или любые другие нередактируемые поля, вероятно, не следует включать в качестве части состояния компонента.
В конце концов, выполнение подобных манипуляций, будем надеяться, будетисключение, а не правило.Я хотел бы создать некоторую вспомогательную функцию, чтобы «дезинфицировать» ваш ввод и двигаться дальше.
function stripTypenames (value) {
if (Array.isArray(value)) {
return value.map(stripTypenames)
} else if (value !== null && typeof(value) === "object") {
const newObject = {}
for (const property in value) {
if (property !== '__typename') {
newObject[property] = stripTypenames(value[property])
}
}
return newObject
} else {
return value
}
}