为Apollo接口编写Resolver:实现ID解析逻辑复用
回答
当然可以!这种方式完全可行,而且正是GraphQL接口 resolver 的核心能力之一——让所有实现该接口的类型自动继承接口上定义的字段 resolver。
当你在Node接口上定义了id字段的 resolver 后,任何实现这个接口的类型(比如Foo、Bar,还有未来新增的其他类型),只要没有为id字段定义自己的专属 resolver,就会自动复用接口上的版本。这正好解决了你提到的痛点:既消除了重复代码,也能避免开发者忘记编码或者遗漏操作的问题。
需要注意的是,主流的GraphQL服务实现(比如Apollo Server、GraphQL.js)都支持这种接口字段 resolver 的继承逻辑,所以不用太担心兼容性问题。
给你一个优化后的完整 resolver 示例参考:
{ Node: { __resolveType: (root) => root.type, id: (root) => encodeId(root.id, root.type) }, Foo: { // 只需要处理 Foo 特有的字段,比如 quantity quantity: (root) => root.quantity // 如果逻辑简单,甚至可以省略,默认会返回 root 对应字段 }, Bar: { // 同理,只处理 Bar 特有的 name 字段 name: (root) => root.name }, // 未来新增的 Node 实现类(比如 Baz),只要实现接口就自动继承 id 的 resolver Baz: { // 仅需处理 Baz 自身的专属字段 } }
另外还有个小细节:如果某个实现类需要对id做特殊处理(比如不同的编码规则),只需要在该类型下重新定义id resolver 即可,它会覆盖接口上的默认实现,灵活性十足。
内容的提问来源于stack exchange,提问作者SCB
相关产品推荐
相关产品推荐

