Apollo中调用useQuery传入resolver方法报TS2345错误如何解决?
错误原因
- 你混淆了Apollo服务端Resolver和客户端查询参数的用途:
resolvers.Query.movies是定义在服务端的解析函数,作用是服务端收到对应查询请求时,执行逻辑拉取数据返回。 - 前端
useQuery钩子的第一个入参要求是DocumentNode类型的GraphQL查询文档(通常用gql标签包裹查询语句生成),你传入服务端的Resolver函数,类型完全不匹配,因此触发TS报错。
修复方案
- 首先在客户端代码中定义对应业务的GraphQL查询语句,使用
gql标签转换为DocumentNode类型:
// 从@apollo/client导入依赖 import { gql, useQuery } from '@apollo/client'; // 定义movies查询,字段和服务端Movie类型保持一致 const MOVIES_QUERY = gql` query GetMovies { movies { id name tmdb_id } } `;
- 替换
useQuery的入参为上面定义的查询文档,不要引入/传入服务端的Resolver代码:
const DashboardComponent = () => { // 也可以添加泛型做类型约束,比如useQuery<{movies: Movie[]}>(MOVIES_QUERY) const {loading, error, data} = useQuery(MOVIES_QUERY); // 后续业务逻辑 }
- 额外校验点:确保项目根组件已经正确包裹了配置好服务端地址的
ApolloProvider,否则前端请求无法到达你的Apollo Server。
内容的提问来源于stack exchange,提问作者Peter Boomsma
相关产品推荐
相关产品推荐

