You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native TypeScript项目中使用Apollo Client遇类型错误求助

解决Apollo Client中gql返回unknown导致useMutation类型报错问题

方案一:用GraphQL Code Generator自动生成类型(推荐)

这是官方推荐的静态类型方案,能自动为你的GraphQL操作生成强类型的TypedDocumentNode,彻底解决类型问题。

  1. 安装代码生成依赖
npm install --save-dev @graphql-codegen/cli @graphql-codegen/client-preset
  1. 初始化配置文件
    运行以下命令,按照提示完成初始化(选择client preset,指定API地址或本地schema文件):
npx graphql-code-generator init
  1. 配置codegen.ts(示例)
    确保配置文件正确指向你的GraphQL schema和包含查询/mutation的文件:
import type { CodegenConfig } from '@graphql-codegen/cli';

const config: CodegenConfig = {
  schema: 'https://your-graphql-api-endpoint', // 替换为你的API地址或本地schema路径
  documents: ['./src/**/*.{ts,tsx}'], // 扫描项目中所有包含GraphQL操作的文件
  generates: {
    './src/gql/': {
      preset: 'client',
      plugins: [],
    },
  },
};

export default config;
  1. 生成类型文件
    package.json会自动添加codegen脚本,运行它:
npm run codegen
  1. 使用生成的类型
    生成的文件中会包含与你的mutation对应的RegisterDocument,直接替换手动定义的registerMutation:
import { useMutation } from '@apollo/client';
import { RegisterDocument } from './src/gql/graphql';

// 组件内使用
const [register] = useMutation(RegisterDocument);

方案二:手动指定TypedDocumentNode类型(临时方案)

如果暂时不想用代码生成工具,可以手动为gql返回值指定类型:

  1. 定义变量和返回类型
// mutation接收的变量类型
type RegisterVariables = {
  email: string;
  password: string;
  companyName?: string;
};

// mutation返回的数据类型
type RegisterResponse = {
  register: {
    name: string;
    email: string;
    profileImage: string;
  };
};
  1. 为gql结果指定TypedDocumentNode类型
import { gql, useMutation, TypedDocumentNode } from '@apollo/client';

export const registerMutation: TypedDocumentNode<RegisterResponse, RegisterVariables> = gql(`
  mutation Register($email: String!, $password: String!, $companyName: String) {
    register(data:{email: $email, password: $password, companyName: $companyName}){
      name
      email
      profileImage
    }
  }
`);
  1. 正常使用useMutation
const [register] = useMutation(registerMutation);

问题原因

默认情况下,未配置类型生成的gql函数返回unknown类型,而useMutation要求传入的参数必须是DocumentNode或TypedDocumentNode类型,因此出现类型不兼容的报错。通过代码生成或手动指定类型,就能让TypeScript正确识别GraphQL操作的类型信息。

内容的提问来源于stack exchange,提问作者Márk Göbölös

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:48:20