React Native中如何定义枚举?如何实现GraphQL无引号传参如Admin而非"Admin"?
嘿,我来帮你搞定这两个问题,都是GraphQL和React Native开发里常见的小坑~
首先得明确:GraphQL里只有枚举类型的值能不带引号,普通字符串必须加引号。如果你想发送Admin而非"Admin",那这个Admin必须是后端GraphQL Schema里定义好的枚举成员,不然GraphQL肯定会报错。下面是具体的解决步骤:
1. 先确认后端已定义对应枚举
先看你的后端GraphQL Schema,得有类似这样的枚举定义:
enum UserRole { ADMIN USER GUEST }
这里的ADMIN就是合法的枚举值,前端发请求时可以直接用,不用套引号。
2. 在GraphQL操作语句里直接用枚举值
比如写一个更新用户角色的Mutation,直接写枚举值就行:
mutation UpdateUserRole($userId: ID!) { updateUser(userId: $userId, role: ADMIN) # 这里ADMIN不带引号,因为是枚举类型 }
只要后端updateUser接口的role参数类型是UserRole枚举,这个请求就不会报错。
3. 用变量传递枚举值的正确姿势
如果用变量传枚举值,变量类型要指定为对应的枚举,前端传变量值时用字符串(注意这是JS里的变量值,不是GraphQL语句里的写法):
mutation UpdateUserRole($userId: ID!, $role: UserRole!) { updateUser(userId: $userId, role: $role) }
然后在React Native代码里,变量可以这么传:
const variables = { userId: '123', role: 'ADMIN' // JS里用字符串,GraphQL会自动映射到枚举类型 };
这样既不用在GraphQL语句里加引号,也避免了变量未定义的问题——只要你确保传的role是枚举里存在的成员就行。
React Native本质是JS/TS环境,所以枚举定义和普通前端项目没啥区别,分两种场景:
1. 纯JavaScript环境
JS本身没有原生枚举,我们可以用冻结的对象来模拟,防止枚举值被意外修改:
// 定义枚举 export const UserRole = Object.freeze({ ADMIN: 'ADMIN', USER: 'USER', GUEST: 'GUEST' }); // 使用方式 console.log(UserRole.ADMIN); // 输出 'ADMIN'
发送GraphQL请求时,直接用UserRole.ADMIN作为变量值,既规范又不容易写错。
2. TypeScript环境(更推荐)
TS有原生枚举支持,定义起来更清晰,还能获得类型检查:
// 字符串枚举(推荐,和GraphQL枚举值对应更直观) export enum UserRole { ADMIN = 'ADMIN', USER = 'USER', GUEST = 'GUEST' } // 使用方式 const currentRole: UserRole = UserRole.ADMIN; // 发送GraphQL变量时直接传currentRole即可
TS的枚举会在编译时做类型检查,如果你写错了枚举值(比如写成UserRole.ADMINN),编辑器会直接报错,避免运行时踩坑。
内容的提问来源于stack exchange,提问作者404notBrighton

