Fez*_*sta 8 typescript apollo graphql graphql-codegen
我使用以下约定让解析器返回部分数据,并允许其他解析器完成缺失的字段:
type UserExtra {
name: String!
}
type User {
id: ID!
email: String!
extra: UserExtra!
}
type Query {
user(id: ID!): User!
users: [User!]!
}
Run Code Online (Sandbox Code Playgroud)
type UserExtra {
name: String!
}
type User {
id: ID!
email: String!
extra: UserExtra!
}
type Query {
user(id: ID!): User!
users: [User!]!
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是 GraphQL 代码生成器生成一个期望返回完整形状Resolver
的类型,当然它不知道即使我从 返回部分形状,由于客户端最终将收到尽管如此,还是符合预期的形状。Query#users
User
Query#users
User#extra
处理此案同时让 TS 满意的最佳方法是什么?
当我遇到此类场景时,我会将extra
字段设为可为空(替换为extra: UserExtra!
)extra: UserExtra
。有很多关于如何处理 Graphql 模式中的可空性的文章(这和这对我有影响的两篇)。
据推测,这些extra
字段在不同的解析器中是分开的,因为您必须执行某种额外的工作才能获取它们,例如从另一个服务或数据存储请求数据。如果该请求最终失败,架构最好将类型声明为可为空,这样其余的用户数据仍然会返回并extra
设置为 null,而不是user
由于为extra
null 并违反架构类型而丢弃其他数据。这篇Non-null fields mean small failures have an outsized impact
文章很好地详细解释了这个问题。权衡是,您的客户端代码需要检查extra
是否为空,但有人可能会认为,这迫使您的客户端代码考虑更优雅地处理可能的失败情况,这是一件好事。
此更改还将解决您尝试解决的原始问题,因为extra
它将是生成的 graphql-code-generator 类型中的可选类型,并且您的主用户解析器不需要返回它。
归档时间: |
|
查看次数: |
1041 次 |
最近记录: |