You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:13:08