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

Apollo GraphQL中如何正确定义符合需求的枚举或Union类型GridSize

错误原因

  • GraphQL 的 Union 类型仅支持联合多个对象类型,不能直接拼接字符串、数字等字面量值,也无法用来定义字段的可选值范围。你想要实现的「限定字段只能取固定枚举值」的需求,有两种符合规范的实现方案:

方案1:使用 Enum 类型(推荐)

Enum 是 GraphQL 原生支持的枚举类型,语法最简单,校验直接在 Schema 层自动生效,仅需要把数字值转成带标识的字符串枚举即可:

# sampleType.graphql
enum GridSize {
  AUTO
  SIZE_1
  SIZE_2
  SIZE_3
  SIZE_4
  SIZE_5
  SIZE_6
  SIZE_7
  SIZE_8
  SIZE_9
  SIZE_10
  SIZE_11
  SIZE_12
}

type Element {
  xs: GridSize
}

使用时前后端传递枚举值即可,如果你需要拿到数字值,在业务层做一次简单转换(比如把SIZE_1截取后半段转成数值)即可。


方案2:自定义标量类型(保留原数值格式)

如果你必须保留'auto'字符串和1-12数字的原始格式,就需要自定义标量,自己实现校验逻辑:
首先修改 Schema 文件:

# sampleType.graphql
scalar GridSize

type Element {
  xs: GridSize
}

然后在 Apollo 服务端注册自定义标量的校验逻辑(以 Node.js 环境为例):

import { GraphQLScalarType, Kind } from 'graphql';
import { ApolloServer } from '@apollo/server';

const GridSizeScalar = new GraphQLScalarType({
  name: 'GridSize',
  description: '网格尺寸,可选值为字符串 "auto" 或 1-12 区间的整数',
  // 校验返回给客户端的值
  serialize(value) {
    if (value === 'auto' || (Number.isInteger(value) && value >= 1 && value <= 12)) {
      return value;
    }
    throw new Error('GridSize 仅允许为 "auto" 或 1-12 的整数');
  },
  // 校验客户端传递的变量值
  parseValue(value) {
    if (value === 'auto' || (Number.isInteger(value) && value >= 1 && value <= 12)) {
      return value;
    }
    throw new Error('GridSize 仅允许为 "auto" 或 1-12 的整数');
  },
  // 校验硬编码在查询语句中的值
  parseLiteral(ast) {
    if (ast.kind === Kind.STRING && ast.value === 'auto') {
      return 'auto';
    }
    if (ast.kind === Kind.INT) {
      const num = parseInt(ast.value, 10);
      if (num >= 1 && num <= 12) return num;
    }
    throw new Error('GridSize 仅允许为 "auto" 或 1-12 的整数');
  }
});

// 在 ApolloServer 配置中注册标量
const server = new ApolloServer({
  typeDefs,
  resolvers: {
    GridSize: GridSizeScalar,
    // 其他业务 resolver
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:06:05