Apollo iOS codegen:在突变中嵌套使用片段会在 Fragments 结构中创建意外的 属性 类型
Apollo iOS codegen: Nested use of a fragment in a mutation creates unexpected property types in Fragments struct
我有以下片段:
fragment User on UserResponse {
firstName
lastName
emailAddress
emailConsent
phoneNumber
}
当在突变中用作根时,代码生成将在 API.swift
中正确生成根 User
结构并将该结构用作 user[=55 的类型=] 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 属性。
但是,当将片段嵌套在突变中时,它会在突变结构中生成嵌套的 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
的 user 属性 是 ExchangePinMutation.Data.ExchangePinForToken.User
类型,而不是我所期望的 User
类型。
因此,类型不同,为了更新我的应用程序中的当前 User
对象,我必须拍摄 ExchangePinMutation.Data.ExchangePinForToken.User
的快照并初始化一个新的 User
对象使用那:例如:
...
let userSnapshot = data.exchangePinForToken.user?.snapshot
Session.currentUser = User(snapshot: userSnapshot)
...
也许我只是在创建错误的片段和/或突变?
问题是ExchangePinMutation.Data.ExchangePinForToken.User.Fragments
结构体的user属性应该是User片段类型,但是这个类型被localExchangePinMutation.Data.ExchangePinForToken.User类型shadow了。
我通过将 User
片段重命名为 UserFull
并创建类型别名解决了我的问题:typealias User = UserFull
几乎不需要重构!
https://github.com/apollographql/apollo-codegen/issues/394#issuecomment-373323235
我有以下片段:
fragment User on UserResponse {
firstName
lastName
emailAddress
emailConsent
phoneNumber
}
当在突变中用作根时,代码生成将在 API.swift
中正确生成根 User
结构并将该结构用作 user[=55 的类型=] 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 属性。
但是,当将片段嵌套在突变中时,它会在突变结构中生成嵌套的 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
的 user 属性 是 ExchangePinMutation.Data.ExchangePinForToken.User
类型,而不是我所期望的 User
类型。
因此,类型不同,为了更新我的应用程序中的当前 User
对象,我必须拍摄 ExchangePinMutation.Data.ExchangePinForToken.User
的快照并初始化一个新的 User
对象使用那:例如:
...
let userSnapshot = data.exchangePinForToken.user?.snapshot
Session.currentUser = User(snapshot: userSnapshot)
...
也许我只是在创建错误的片段和/或突变?
问题是ExchangePinMutation.Data.ExchangePinForToken.User.Fragments
结构体的user属性应该是User片段类型,但是这个类型被localExchangePinMutation.Data.ExchangePinForToken.User类型shadow了。
我通过将 User
片段重命名为 UserFull
并创建类型别名解决了我的问题:typealias User = UserFull
几乎不需要重构!
https://github.com/apollographql/apollo-codegen/issues/394#issuecomment-373323235