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

TypeScript中向GraphQL查询传动态变量时遇参数错误

解决GraphQL查询传递动态变量时的"expected two arguments but got one"错误

咱们先拆解下你遇到的问题:这个错误大概率和TypeScript类型校验以及graphql高阶组件(HOC)的参数配置有关,结合你给出的代码,我整理了几个针对性的修复方向:

1. 先规范GraphQL查询的结构(可选但能避免潜在问题)

你的查询里同时包含了allFile和faqsJson两个顶级字段,语法上没问题,但可以给查询起个明确的名字,同时让变量$slug的作用域更清晰:

export const queryFragment = graphql`
  query FqlQuery1($slug: String!) {
    allFile {
      edges {
        node {
          childFaqsJson {
            title
            questions {
              title
              content
            }
          }
        }
      }
    }
    faqsResult: faqsJson(fields: { slug: { eq: $slug } }) {
      title
      questions {
        title
        content
      }
    }
  }
`;

2. 给graphql HOC配置符合TypeScript要求的参数

在TypeScript环境下,graphql HOC(比如Gatsby中的实现)对类型校验很严格,你需要明确定义组件props和查询结果的类型,同时正确配置变量的获取逻辑:

步骤1:定义类型结构

// 定义查询返回的数据结构
interface FqlQueryData {
  allFile: {
    edges: Array<{
      node: {
        childFaqsJson?: {
          title: string;
          questions: Array<{ title: string; content: string }>;
        };
      };
    }>;
  };
  faqsResult: {
    title: string;
    questions: Array<{ title: string; content: string }>;
  };
}

// 定义组件接收的props,包含查询数据和需要传入的slug
interface ComponentProps {
  data: FqlQueryData;
  slug: string;
}

步骤2:正确配置graphql HOC的参数

错误提示说"expected two arguments but got one",本质是TypeScript没识别到第二个参数的合法类型,你需要明确指定类型参数,并在配置里告诉HOC如何获取$slug变量:

// 假设你的组件是函数组件
const YourComponent = ({ data }: ComponentProps) => {
  // 组件渲染逻辑
  return (
    <div>
      <h1>{data.faqsResult.title}</h1>
      {/* 渲染其他内容 */}
    </div>
  );
};

// 明确指定类型参数,同时配置变量来源
export default graphql<ComponentProps, { slug: string }>(
  queryFragment,
  {
    options: (props) => ({
      variables: {
        slug: props.slug, // 从组件props中获取动态slug
      },
    }),
  }
)(YourComponent);

3. 检查依赖的类型定义版本

如果上述方法还是报错,可能是你的@types/gatsby(或对应GraphQL HOC的类型包)版本不匹配,导致TypeScript对graphql函数的参数推断错误。尝试更新相关类型依赖:

npm install @types/gatsby --save-dev
# 或者用yarn
yarn add @types/gatsby --dev

总结一下:核心问题是TypeScript对graphql HOC的参数类型校验严格,你需要明确指定类型,并正确配置动态变量的获取逻辑,同时确保查询本身的语法规范。

内容的提问来源于stack exchange,提问作者Neha Takhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:42:45