在GraphQL中,当使用`interfaces`功能时,如何处理`resolveType`和`isTypeOf`?

时间:2017-04-18 10:28:57

标签: graphql graphql-js

我读过这篇伟大的要点 - GraphQLInterfaceType

但仍有一些困惑:

  1. 是否真的有必要为所有GraphQL架构类型定义ES6 classes
    • 主要关注点是:我们最终会有大量空ES6 classes和等量的GraphQL types
  2. 如果不是,那么在使用resolveType功能时如何正确处理isTypeOfinterfaces
  3. 即使我为所有ES6 classes定义了所有GraphQL types,但原始数据是在不同的地方构建的,使用不同的技术,如grpc+protobuf,这与这些类定义没有任何关系,那么isTypeOf: (value) => value instanceof Dog如何在这里工作?

1 个答案:

答案 0 :(得分:3)

resolveTypeisTypeOf的实施非常灵活,原因如下:它非常适合特定应用。它取决于数据库,数据模型,类型类型,等等。某些后端可能为其所有模型分别具有单独的ES6类,尤其是在使用ORM时,在查询数据库时它会创建这些类的实例。但是ORM不是必需的。并且您不应该被要求实例化任何其他类以找出GraphQL类型。

在某些情况下,您只能从对象的属性中确定类型。如果您的应用不是这种情况,那么您可以采取一些措施来提供提示。这是一个SQL示例。

SELECT
  id,
  body,
  author_id,
  post_id,
  'Comment' AS "$type" -- leave a hint to resolve the type
FROM comments
UNION
SELECT
  id,
  body,
  author_id,
  NULL AS post_id,
  'Post' AS "$type" -- leave a hint to resolve the type
FROM posts

此查询提供了一个"类型提示",一个额外的计算列,因此实现resolveType是一个简单的属性查找。其他DBMS可以使用类似的策略。