在 GraphQL 中,当大量使用 interfaces 特性时,如何处理 `resolveType` 和 `isTypeOf`?
In GraphQL, how to handle the `resolveType` and `isTypeOf` when use the `interfaces` feature a lot?
我已经通读了这个伟大的要点 - GraphQLInterfaceType
但还是有一些困惑:
- 真的有必要为所有 GraphQL 架构类型定义
ES6 classes
吗?
- 这里主要担心的是:我们最终会得到很多空
ES6 classes
和等量的 GraphQL types
。
- 如果不是,那么在大量使用
interfaces
功能的情况下,如何正确处理resolveType
和isTypeOf
?
- 即使我为所有
GraphQL types
定义了所有ES6 classes
,但是原始数据是在不同的地方用不同的技术构建的,比如grpc+protobuf
,这与这些没有任何关系类 定义,那么 isTypeOf: (value) => value instanceof Dog
在这里如何工作?
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
此查询提供了一个 "type hint",一个额外的计算列,因此实现 resolveType
是一个简单的 属性 查找。其他 DBMS 可以使用类似的策略。
我已经通读了这个伟大的要点 - GraphQLInterfaceType
但还是有一些困惑:
- 真的有必要为所有 GraphQL 架构类型定义
ES6 classes
吗?- 这里主要担心的是:我们最终会得到很多空
ES6 classes
和等量的GraphQL types
。
- 这里主要担心的是:我们最终会得到很多空
- 如果不是,那么在大量使用
interfaces
功能的情况下,如何正确处理resolveType
和isTypeOf
? - 即使我为所有
GraphQL types
定义了所有ES6 classes
,但是原始数据是在不同的地方用不同的技术构建的,比如grpc+protobuf
,这与这些没有任何关系类 定义,那么isTypeOf: (value) => value instanceof Dog
在这里如何工作?
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
此查询提供了一个 "type hint",一个额外的计算列,因此实现 resolveType
是一个简单的 属性 查找。其他 DBMS 可以使用类似的策略。