如何为GraphQL枚举(ENUM)设置@Pattern指令?
GraphQL 枚举类型配置 @Pattern 指令的实操方法
首先明确基础规则:@Pattern 指令默认仅面向 String 类型设计,原生不支持直接作用在 ENUM 枚举类型上。枚举本身的固定可选值属性已经自带取值约束,仅在需要对枚举值命名规则、可查询范围做额外正则校验的特殊场景下,才需要额外配置@Pattern。
步骤1:扩展@Pattern指令的适用范围
你需要先修改@Pattern的指令定义,在适用范围中新增ENUM、ARGUMENT_DEFINITION(可根据实际使用场景增减),示例指令定义代码如下:
# 扩展后的@Pattern指令,支持作用在枚举类型、字段参数、输入字段上 directive @Pattern(regexp: String!, message: String) on ENUM | FIELD_DEFINITION | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION
步骤2:按需给枚举/参数挂载指令
场景A:校验枚举值的命名规范(构建时生效)
如果你需要约束当前枚举下所有枚举值的命名规则,直接在枚举定义上挂载@Pattern即可,比如要求所有枚举值必须为大写字母+下划线的格式:
@Pattern(regexp: "^[A-Z][A-Z0-9_]*$", message: "枚举值需符合大写+下划线的命名规范") enum OrderStatus { CREATED PAID SHIPPED CANCELLED }
场景B:校验运行时传入的枚举取值范围
如果你需要限制接口调用时可传入的枚举值范围,直接在对应参数/输入字段上挂载@Pattern即可,比如仅允许查询已创建、已支付状态的订单:
type Query { getOrder( orderId: ID! status: OrderStatus @Pattern(regexp: "^(CREATED|PAID)$", message: "仅支持查询已创建、已支付的订单") ): Order }
注意:非必要场景不建议给枚举加@Pattern约束,枚举本身的取值校验已经能覆盖绝大多数需求,额外加正则校验会增加不必要的运行时开销。
内容的提问来源于stack exchange,提问作者raji
相关产品推荐
相关产品推荐

