使用mercurius+fastify集成typegraphql时出现类型匹配报错如何解决?
报错触发原因
这是典型的TypeScript类型不兼容报错,核心根源是项目内存在多个版本的graphql包:
TypeGraphQL依赖的graphql版本和Mercurius依赖的graphql版本不一致,两个版本导出的GraphQLSchema类型定义存在差异,你通过TypeGraphQL构建的Schema属于低版本类型,缺失高版本要求的description、getImplementations、isSubType三个属性,因此传入Mercurius时类型校验不通过。
少数情况下也可能是@types/graphql、@types/mercurius的版本和实际安装的包版本不匹配导致类型识别错误。
可行修复方案
- 优先统一项目内的
graphql依赖版本
先执行npm ls graphql(yarn执行yarn list graphql,pnpm执行pnpm ls graphql)查看当前安装的所有graphql版本,在package.json中添加配置强制所有依赖使用同一个兼容版本的graphql:
如果你使用npm,添加overrides配置:
如果你使用yarn或pnpm,将上述配置的{ "overrides": { "graphql": "^16.8.1" } }overrides改为resolutions即可。配置完成后删除node_modules文件夹和包锁文件(package-lock.json/yarn.lock/pnpm-lock.yaml),重新安装依赖即可解决版本冲突。 - 临时类型兼容方案
如果需要快速绕过类型校验,可以给传入的Schema添加类型断言:
注意这只是临时绕开校验的方案,后续还是建议优先统一依赖版本从根源解决问题。import { GraphQLSchema } from 'graphql' // 构建schema的逻辑 const schema = await buildSchema(/* your config */) // 注册mercurius时断言类型 fastify.register(mercurius, { schema: schema as unknown as GraphQLSchema, // 其余配置 }) - 升级依赖到兼容版本
确认你使用的TypeGraphQL和Mercurius都支持你选择的graphql版本:TypeGraphQL 2.x版本支持graphql 16.x,Mercurius v10及以上版本也支持graphql 16.x,将两个包升级到对应兼容版本也可解决冲突。
内容的提问来源于stack exchange,提问作者Ghyath Darwish
相关产品推荐
相关产品推荐

