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

我有一个先使用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的另一点。

谢谢!

snailtoto 回答:在GraphQL中键入动态构建的上下文?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3136042.html

大家都在问