在GraphQL中键入动态构建的上下文?

时间:2019-11-08 17:44:14

标签: typescript graphql apollo-server

我有一个先使用SDL的GraphQL服务器,尝试将其逐步转换为TypeScript。为了使SDL-first方法更具模块化,在启动Apollo Server之前,我使用了许多glob将SDL DocumentNode,解析器,数据加载器,模型类等缝合在一起。我喜欢这种技术,因为它消除了在多个地方使用数十个import语句的需要,并且对文件名的更改更具弹性(只要这些文件名仍然与全局模式匹配)。这意味着传递给Apollo Server的context对象是动态构造的,并且在解析器/数据加载器级别最终成为TypeScript的问题,因为TypeScript无法知道context对象的形状

所以如果我有一个ThingModel类,例如

class ThingModel {
  static async get( args ) { ... }
}

附加到分配给context.models的对象(它可能具有自己的类型),像这样的解析器

async function fetchMyThing( parent, args, context, info ) {
  return await context.models.ThingModel.get( args );
}

将无法推断ThingModel的类型。

我假设如果我能够键入整个context对象,例如,我可以实现我想要的类型推断。像

interface IContext {
  models: IModels
}

interface IModels {
  ThingModel: typeof ThingModel
}

const context : IContext = {
  ...
}

// now pass context to server initialization

是否有一种(好的)方法来实现这一目标,而不必回到手动import设置上下文的所有内容(以便随后可以声明接口)的方式?

FWIW,我应该提一下,我们不愿嫁给SDL优先的GraphQL,而是可能决定通过GraphQL Nexus或TypeGraphQL转向代码优先的GraphQL(这仍然是一个很小的项目),因此,如果这些框架提供了高效的“类型传播”可能是支持切换到代码优先的GraphQL的另一点。

谢谢!

0 个答案:

没有答案