在 GraphQL 中,当大量使用 interfaces 特性时,如何处理 `resolveType` 和 `isTypeOf`?

In GraphQL, how to handle the `resolveType` and `isTypeOf` when use the `interfaces` feature a lot?

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

但还是有一些困惑:

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

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

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