Pothos中Resolver返回分页对象而非数组引发类型错误,如何正确定义自定义响应objectType?
Pothos中Resolver返回分页对象而非数组引发类型错误,如何正确定义自定义响应objectType?
我明白你现在的困惑——刚接触Pothos的自定义响应类型时,很容易在类型匹配上踩坑。看你的错误信息和代码,问题的根源其实是分页响应类型的命名冲突,导致Pothos的类型系统误解了你要返回的结构。
问题分析
你把分页响应的objectType命名为'User',但这个名字应该是给单个用户的类型用的。Pothos会根据类型名来识别预期的返回结构,重名后它错误地认为你的查询应该返回User数组(也就是单个用户的列表),但你的Resolver实际返回的是包含items、totalPages和currentPage的分页对象,这就导致了类型不匹配的报错。
解决步骤
我们只需要修正几个关键点,就能解决这个类型错误:
1. 确保单个用户类型与分页类型的命名区分开
首先,确认你已经有一个代表单个用户的objectType,比如:
// 单个用户的类型定义,名字为'User' export const User = builder.objectType('User', { fields: (t) => ({ _id: t.id(), firstName: t.string(), lastName: t.string(), email: t.string(), b2cId: t.string(), markets: t.stringList(), // 其他用户相关字段... }), });
然后,为分页响应创建一个唯一命名的objectType,比如'AdminUserPaginatedResponse',明确它的结构是包含用户列表和分页元数据的对象:
// 定义分页响应类型,命名唯一避免冲突 export const AdminUserPaginatedResponse = builder.objectType('AdminUserPaginatedResponse', { fields: (t) => ({ items: t.field({ type: [User], // 这里指定为User数组类型 resolve: (root) => root.items, }), totalPages: t.int({ resolve: (root) => root.totalPages, }), currentPage: t.int({ resolve: (root) => root.currentPage, }), }), });
2. 修改查询字段的类型指向正确的分页响应类型
在你的查询定义中,确保type属性指向我们刚创建的AdminUserPaginatedResponse,而不是之前冲突的User类型:
builder.queryFields((t) => ({ getAdminUser: t.field({ type: AdminUserPaginatedResponse, // 这里指向正确的分页类型 args: { filter: t.arg({ type: 'String' }) || getFilterQuerySchema(FILTER_DATA_ARGUMENT_HINT), page: t.arg({ type: 'Int' }), searchQuery: t.arg({ type: 'String' }), }, resolve: async (_, args, ctx) => { // 你的Resolver逻辑保持不变... return { items: adminUsersList, totalPages, currentPage: page || 1, }; }, }), }));
3. 可选:添加类型接口增强类型安全
为了避免使用any带来的潜在问题,你可以定义一个TypeScript接口来描述分页结果的结构,然后在objectType中使用它:
// 定义分页结果的接口 interface AdminUserPaginatedResult { items: User[]; totalPages: number; currentPage: number; } // 用接口约束objectType的类型 export const AdminUserPaginatedResponse = builder.objectType<AdminUserPaginatedResult>( 'AdminUserPaginatedResponse', { fields: (t) => ({ // 字段定义同上... }), } );
总结
核心问题就是类型命名冲突导致Pothos误解了预期的返回结构。只要给分页响应类型一个唯一的名字,确保查询字段的类型指向它,Resolver返回的对象结构和objectType定义的字段完全匹配,就能解决这个类型错误啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

