Кодогенерация Apollo iOS: вложенное использование фрагмента в мутации создает неожиданные типы свойств в структуре фрагментов

У меня есть такой фрагмент:

fragment User on UserResponse {
    firstName
    lastName
    emailAddress
    emailConsent
    phoneNumber
}

При использовании в качестве корня в мутации генерация кода правильно сгенерирует корневую структуру User в API.swift и будет использовать эту структуру в качестве типа свойств Пользователь в Fragments.

Например.:

mutation updateUserYourInformation($phoneNumber: String!, $emailConsent: Boolean!) {
    updateUser(phoneNumber: $phoneNumber, emailConsent: $emailConsent) {
        ...User
    }
}

а также

mutation addRelations($spouse: Boolean!, $children: Int!, $roomMates: Int!) {
     addRelations(spouse: $spouse, roommates: $roomMates, children: $children) {
        ...User
    }
}

будет генерировать мутации, в которых и UpdateUserYourInformationMutation.Data.UpdateUser.Fragments, и AddRelationsMutation.Data.AddRelation.Fragments имеют свойство Пользователь одного и того же типа структуры User.

Однако при вложении фрагмента в мутацию он генерирует вложенную структуру User в структуре мутации, которая будет типом свойства Пользователь в сгенерированной вложенной структуре Fragments. Например:

mutation exchangePin($email: String!, $pin: String!) {
    exchangePinForToken(email: $email, pin: $pin) {
        valid
        user {
            ...User
        }
        authToken
        remainingAttempts
    }
}

сгенерирует структуры ExchangePinMutation.Data.ExchangePinForToken.User и ExchangePinMutation.Data.ExchangePinForToken.User.Fragments. Однако свойство ПользовательExchangePinMutation.Data.ExchangePinForToken.User.Fragments относится к типу ExchangePinMutation.Data.ExchangePinForToken.User, а не к типу User, как я ожидал.

Следовательно, типы различаются, и для обновления текущего объекта User в моем приложении я должен сделать снимок ExchangePinMutation.Data.ExchangePinForToken.User и инициализировать новый объект User, используя это: Например:

...
let userSnapshot = data.exchangePinForToken.user?.snapshot
Session.currentUser = User(snapshot: userSnapshot)
...

Может, я просто неправильно создаю свои фрагменты и / или мутации?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
448
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что свойство пользователя структуры ExchangePinMutation.Data.ExchangePinForToken.User.Fragments должно иметь тип фрагмента «Пользователь», но этот тип дублируется локальным типом ExchangePinMutation.Data.ExchangePinForToken.User.

Я исправил свою проблему, переименовав фрагмент User в UserFull и создав псевдоним: typealias User = UserFull

Рефакторинг практически не требуется!

https://github.com/apollographql/apollo-codegen/issues/394#issuecomment-373323235

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