TypeScript中如何正确声明兼容自定义Context的Mercurius解析器?
优雅解决Mercurius自定义Context的TypeScript类型问题
方法1:让自定义Context继承MercuriusContext
Mercurius的解析器上下文参数默认要求为MercuriusContext类型,只需让你的自定义Context接口继承该类型,就能让TypeScript自动兼容:
- 先导入Mercurius的上下文类型:
import type { MercuriusContext } from 'mercurius';
- 修改自定义Context接口:
export interface Context extends MercuriusContext { prisma: PrismaClient; }
- 直接在解析器中使用自定义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泛型来显式指定上下文类型,让解析器自动推导参数类型:
- 导入Resolver类型:
import type { Resolver } from 'mercurius';
- 用泛型定义解析器对象:
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
相关产品推荐
相关产品推荐

