![](/img/trans.png)
[英]What strict typescript type to return from graphql resolver using eslint?
[英]Return incomplete shapes from resolver with GraphQL Code Generator
我使用以下约定让解析器返回部分数据,并允许其他解析器完成缺失的字段:
type UserExtra {
name: String!
}
type User {
id: ID!
email: String!
extra: UserExtra!
}
type Query {
user(id: ID!): User!
users: [User!]!
}
const getUser = (id: string): { id: string, email: string, extra: { name: string } => fetchUser(id);
// `fetchUsers` only returns `id` and `email`, but not `extra`
const getUsers = (): { id: string, email: string }[] => fetchUsers();
// we can use this function to fetch the extra field for a given user
const getUserExtra = (id: string): { name: string } => fetchUserExtra();
export default {
Query: {
user: (parent, args) => getUser(args.id),
users: () => getUsers(),
},
User: {
// here we fetch the `extra` field anytime an `User` is requested
// in real-life I would check if the query is requesting the `extra`
// field or not, and only fetch the data if requested by the query
extra: (parent) => {
return getUserExtra(parent.id)
},
}
}
我遇到的问题是 GraphQL 代码生成器生成一个Resolver
类型,它期望Query#users
返回完整的User
形状,当然它不知道即使我从Query#users
返回部分形状,谢谢对于User#extra
,客户端最终将收到预期的形状。
在让 TS 满意的同时处理这种情况的最佳方法是什么?
当我有这些类型的场景,我做了extra
领域可以为空(更换extra: UserExtra!
有extra: UserExtra
)。 有许多文章告诉我们怎样在你的Graphql架构治疗为空( 这和这是两个人有影响力对我来说)。
据推测, extra
字段在不同的解析器中分离,因为您必须做一些额外的工作来获取它们,例如从另一个服务或数据存储请求数据。 如果该请求最终失败,那么架构将类型声明为可为空是很好的,因此其余用户数据仍会返回并extra
设置为空,而不是因为extra
为空并违反架构而将其他user
数据扔掉类型。 Non-null fields mean small failures have an outsized impact
, 这篇文章很好地详细解释了这个问题。 权衡是,那么您的客户端代码需要检查extra
是否为 null,但有人可能会争辩说,这迫使您的客户端代码考虑更优雅地处理可能的失败案例,这是一件好事。
此更改还将解决您尝试解决的原始问题,因为extra
将是生成的 graphql-code-generator 类型中的可选类型,并且您的主用户解析器不需要返回它。
有一个名为mapper的配置选项。 基本上,您可以指定(覆盖)解析器的返回类型,以更好地匹配代码中的实际返回类型。
实际上 GraphQL 通常允许您在解析器中返回任何类型的数据。 所以这就是为什么我们有映射器来指定它们的类型。
有关更多详细信息https://github.com/dotansimha/graphql-code-generator/discussions/4030
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.