使用 GraphQL 代码生成器从解析器返回不完整的形状

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#usersUserQuery#usersUser#extra

处理此案同时让 TS 满意的最佳方法是什么?

TLa*_*add 3

当我遇到此类场景时,我会将extra字段设为可为空(替换为extra: UserExtra!extra: UserExtra。有很多关于如何处理 Graphql 模式中的可空性的文章(对我有影响的两篇)。

据推测,这些extra字段在不同的解析器中是分开的,因为您必须执行某种额外的工作才能获取它们,例如从另一个服务或数据存储请求数据。如果该请求最终失败,架构最好将类型声明为可为空,这样其余的用户数据仍然会返回并extra设置为 null,而不是user由于为extranull 并违反架构类型而丢弃其他数据。这篇Non-null fields mean small failures have an outsized impact文章很好地详细解释了这个问题权衡是,您的客户端代码需要检查extra是否为空,但有人可能会认为,这迫使您的客户端代码考虑更优雅地处理可能的失败情况,这是一件好事。

此更改还将解决您尝试解决的原始问题,因为extra它将是生成的 graphql-code-generator 类型中的可选类型,并且您的主用户解析器不需要返回它。