在 Typescript 中如何正确声明 Mercurius 解析器?

问题描述 投票:0回答:2

我有一个如下定义的自定义上下文,我将其传递给 Mercurius。

export interface Context {
  prisma: PrismaClient
}

const prisma = new PrismaClient()

export const context: Context = {
  prisma: prisma,
}

我的 Mercurius 定义如下。

app.register(mercurius, {
  schema,
  resolvers,
  graphiql: true,
  context: () => context /* This is the context object from above */,
})

我很难定义接受上下文对象的

resolvers

根据 Mercurius 文档,调用解析器函数时,第二个参数是 Graphql 中传递给它的参数,第三个参数是上下文对象。但是,如果我定义了如下所示的解析器,我会从 Typescript 中收到错误。

const resolvers = {
    Query: {
      findFirst: async (_:any, args:any, ctx:Context) => {
          //...
      }
    }
  };

Mercurius 似乎定义了预期的签名,其中上下文参数的类型为

MercurialContext
。就我而言,我的上下文不需要
MercuriusContext
中的额外信息,因此我不扩展它。所以,我被迫声明我的解析器如下。

const resolvers = {
    Query: {
      findFirst: async (_:any, args:any, ctx:any) => {
          //...Then in my code I am using 'ctx as Context' to force it into my object
      }
    }
  };

Typescript 有什么优雅的方式来处理这个问题吗?

typescript graphql fastify mercurius
2个回答
0
投票
import type { IResolvers } from 'mercurius'

const resolvers: IResolvers = {
    Query: {
        findFirst: async (_:any, args:any, ctx:any) => {
        …
        }
    }
}

0
投票

我创建了一个声明文件来重新定义

MercuriusContext
,以便我可以手动设置其类型。请参阅参考

interface PrismaContext {
  prisma: PrismaClient
}


declare module 'mercurius' {
  interface MercuriusContext extends PrismaContext {
    // Same Interface members as the original MercuriusContext
    app: FastifyInstance;
    reply: FastifyReply;
    operationsCount?: number;
    operationId?: number;
    __currentQuery: string;
    pubsub: PubSub;
  }
}

注册 Mercurius

const prisma = new PrismaClient()

app.register(mercurius, {
  //...
  context: () => {
    return { prisma: prisma }
  }
})

然后在您的 Mercurius 解析器中

export const resolverName = async (_parent: unknown, _args: unknown, context: PrismaContext) => {
  const { prisma } = context;

  // Resolver code
}
© www.soinside.com 2019 - 2024. All rights reserved.