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

lns*_*shi 7 graphql graphql-js

我已经阅读了这个伟大的要点 - GraphQLInterfaceType

但仍有一些困惑:

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

And*_*son 4

resolveType和的实现isTypeOf非常灵活是有原因的:它非常特定于应用程序。这取决于数据库、数据模型、类型的相似程度等等。某些后端可能为其所有模型拥有单独的 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
Run Code Online (Sandbox Code Playgroud)

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