Vapor使用GraphQLKit定义Schema时ChildType泛型无法推断如何解决
Vapor + GraphQLKit 可选关联字段报错修复方案
报错原因
你遇到的Generic parameter 'ChildType' could not be inferred错误,是GraphQLKit在处理Fluent的@OptionalChild可选关联关系时,缺少足够的类型信息无法自动推导泛型参数导致的。默认的Field构造器仅可以对非可选的@Child关联自动完成类型推断,对可选的子关联/父关联投影属性无法自动识别返回类型。
修复方法
你可以选择以下任意一种方案修改报错的字段定义代码:
方案1:显式指定字段返回类型(最简单)
直接在Field构造器中声明可选的关联对象类型,给编译器提供明确的类型信息即可,修改后的代码如下:
Type(User.self) { Field("id", at: \.id) Field("name", at: \.name) // 新增type参数指定返回类型 Field("record", type: Record?.self, with: \.$record) }
如果后续Record的user字段也出现同类报错,用同样的方法修改即可:
Field("user", type: User?.self, with: \.$user)
方案2:手动实现关联加载逻辑
如果需要对关联加载的逻辑做自定义控制,也可以用resolve闭包手动加载关联对象:
Field("record", type: Record?.self) { user, context, eventLoop in // context为你的请求上下文,需要携带Fluent的数据库连接实例 return user.$record.load(on: context.db) .map { user.record } }
注意事项
- 确保所有用到的模型类型都已经在Schema中提前定义,你当前的代码已经同时声明了
User和Record的Type定义,不会出现类型未注册的问题 - 该方案同样适用于
@OptionalParent、@Siblings等其他Fluent关联类型的GraphQL字段定义
内容的提问来源于stack exchange,提问作者ItayAmza
相关产品推荐
相关产品推荐

