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

TypeScript中如何正确声明兼容自定义Context的Mercurius解析器?

优雅解决Mercurius自定义Context的TypeScript类型问题

方法1:让自定义Context继承MercuriusContext

Mercurius的解析器上下文参数默认要求为MercuriusContext类型,只需让你的自定义Context接口继承该类型,就能让TypeScript自动兼容:

  1. 先导入Mercurius的上下文类型:
import type { MercuriusContext } from 'mercurius';
  1. 修改自定义Context接口:
export interface Context extends MercuriusContext {
  prisma: PrismaClient;
}
  1. 直接在解析器中使用自定义Context类型:
const resolvers = {
  Query: {
    findFirst: async (_: unknown, args: unknown, ctx: Context) => {
      // 可直接访问ctx.prisma,类型完全匹配
      return ctx.prisma.someModel.findFirst(args);
    }
  }
};

方法2:使用Mercurius的Resolver泛型指定上下文

如果不想修改自定义Context的继承关系,可借助Mercurius提供的Resolver泛型来显式指定上下文类型,让解析器自动推导参数类型:

  1. 导入Resolver类型:
import type { Resolver } from 'mercurius';
  1. 用泛型定义解析器对象:
const resolvers: Resolver<Context> = {
  Query: {
    findFirst: async (_: unknown, args: unknown, ctx) => {
      // ctx会自动推断为你的自定义Context类型,无需手动声明
      return ctx.prisma.someModel.findFirst(args);
    }
  }
};

额外优化:给请求参数添加类型

如果需要给args也提供类型提示,可以手动定义参数接口,或者结合graphql-codegen生成的类型:

// 手动定义参数类型
interface FindFirstArgs {
  where: { id: number };
}

const resolvers: Resolver<Context> = {
  Query: {
    findFirst: async (_: unknown, args: FindFirstArgs, ctx) => {
      return ctx.prisma.someModel.findFirst(args);
    }
  }
};

以上两种方法都能避免使用any类型或强制类型转换,让代码类型更安全、更优雅。

内容的提问来源于stack exchange,提问作者AppleGrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:25:15