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