React-Native中Apollo Client如何传递枚举值而非字符串作为参数?
解决Apollo Client中传递GraphQL枚举参数的问题
嘿,我来帮你搞定这个问题!其实在GraphQL规则里,当你传递字符串"PRICE"作为枚举类型的变量时,Apollo Client会自动把它转换成对应的枚举值发送给服务器——不过我懂你想要的是在代码里用更规范的枚举常量(而非硬编码字符串)的感觉,这样不仅能避免拼写错误,代码也更易维护。下面给你两种可行的方案:
方法1:用GraphQL代码生成工具生成枚举(推荐)
如果你的项目已经在用GraphQL Codegen,它能自动从你的GraphQL Schema里生成对应的枚举类型,直接用就行:
- 先确保你的代码生成配置里开启了枚举生成(比如在
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;
- 运行代码生成命令后,你就能在代码里导入生成的枚举:
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
相关产品推荐
相关产品推荐

