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

React-Native中Apollo Client如何传递枚举值而非字符串作为参数?

解决Apollo Client中传递GraphQL枚举参数的问题

嘿,我来帮你搞定这个问题!其实在GraphQL规则里,当你传递字符串"PRICE"作为枚举类型的变量时,Apollo Client会自动把它转换成对应的枚举值发送给服务器——不过我懂你想要的是在代码里用更规范的枚举常量(而非硬编码字符串)的感觉,这样不仅能避免拼写错误,代码也更易维护。下面给你两种可行的方案:

方法1:用GraphQL代码生成工具生成枚举(推荐)

如果你的项目已经在用GraphQL Codegen,它能自动从你的GraphQL Schema里生成对应的枚举类型,直接用就行:

  1. 先确保你的代码生成配置里开启了枚举生成(比如在codegen.ts里):
// codegen.ts
import type { CodegenConfig } from '@graphql-codegen/cli';

const config: CodegenConfig = {
  schema: 'your-schema-path.graphql', // 替换成你的Schema实际路径
  documents: ['./src/**/*.graphql'], // 你的查询/突变文件路径
  generates: {
    './src/generated/graphql.ts': {
      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'],
      config: {
        enumsAsTypes: false, // 确保生成的是枚举而非类型别名
      },
    },
  },
};

export default config;
  1. 运行代码生成命令后,你就能在代码里导入生成的枚举:
import { ProductCollectionSortKeys } from './src/generated/graphql';

// 调用查询时直接用枚举值
getCollection({ variables: { sortKey: ProductCollectionSortKeys.PRICE } });
// 注:生成的枚举键名可能会根据工具配置略有不同,比如首字母小写,具体看生成的代码哦

方法2:手动定义枚举常量

如果没用到代码生成工具,自己手动定义枚举或者常量对象也很简单:

// 方式一:用TypeScript枚举
enum ProductCollectionSortKeys {
  PRICE = 'PRICE',
  // 可以在这里添加其他枚举值,比如TITLE、CREATED_AT之类的
}

// 方式二:用常量对象(如果不需要枚举类型,只是想避免硬编码字符串)
const ProductCollectionSortKeys = {
  PRICE: 'PRICE' as const,
};

// 调用查询时使用
getCollection({ variables: { sortKey: ProductCollectionSortKeys.PRICE } });

另外补充一句:其实严格来说,直接传字符串"PRICE"是符合GraphQL规范的,Apollo Client会正确处理并把它作为枚举值发送给服务器。但使用枚举常量的好处是让代码更健壮——比如拼写错了的话TypeScript会直接报错,不用等到请求失败才发现问题~

内容的提问来源于stack exchange,提问作者Emanuele Scarabattoli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 23:02:33