我使用以下约定让解析器返回部分数据,并允许其他解析器完成缺失的字段:
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 满意的同时处理这种情况的最佳方法是什么?