如何定义可被编译器校验的GraphQL指令对象数组参数?
定义带编译期校验的GraphQL指令对象数组参数
首先明确:GraphQL指令的参数只能用输入类型(Input Type)——也就是input关键字定义的类型,不能用type声明的对象类型,所以你把Data改成type时触发的报错是符合规范的正常行为。
至于你遇到的input类型参数没被校验的情况,这大概率是你用的GraphQL编译工具的问题。按照GraphQL官方规范,指令参数必须严格匹配对应的input结构,不符合的参数应该在编译阶段直接报错。
要实现带编译期校验的指令对象数组参数,你最开始的写法本身就是正确的,关键是要确保使用的GraphQL工具(比如GraphQL.js、Apollo Server这类)支持完整的指令参数校验:
input Data { someField: String! anotherField: String! } directive @someDirective( args: [Data!]! ) on OBJECT # 符合Data结构,编译正常通过 type SomeType @someDirective( args: [{someField: "blah", anotherField: "blah"}] ) { empty: String } # 不符合Data结构,规范要求编译时直接报错 # type AnotherType @someDirective( args: [{blah: "blah", blah2: "blah"}] ) { # empty: String # }
如果你的工具没做校验,建议升级对应的GraphQL库版本,或者检查工具配置——有些工具可能默认关闭了部分校验规则,需要手动开启。
总结两点:
- 指令参数必须用
input类型,type类型不被允许 - 合规的GraphQL工具都会对指令参数做编译期校验,没校验是工具的问题,不是写法的问题
内容的提问来源于stack exchange,提问作者jmc42
相关产品推荐
相关产品推荐

