首页 > 解决方案 > 检查给定类型是否具有名为 X 的属性。减少内联片段

问题描述

我有一个获取一些事件数组的查询。内部的每个节点都edges可以实现有限数量的接口。

问题: 是否可以检查给定节点是否具有名为 X 的属性(在本例中为id,timestampcontent)而不是使用多个内联片段 ( ... on {Type})?

        events(last: $eventCount) {
            edges {
                node {
                    ... on Type1 {
                        id
                        timestamp
                        content
                    }
                    ... on Type2 {
                        id
                        timestamp
                        content
                    }
                    ... on Type3 {
                        id
                        timestamp
                        content
                    }
                    ... on Type4 {
                        id
                        timestamp
                        content
                    }
                }
            }
        }

在这个例子中,我想摆脱... on Type1,... on Type2等等,只检查id,timestampcontent属性是否存在。

标签: graphql

解决方案


根据您要达到的目标,这里有两个答案,但简短的答案是否定的:您不能根据您正在阅读的值有条件地传播片段。

但是,您可以做的是检查接口本身。您提到这些节点都实现了接口。所以我假设这些节点要么都实现了一个通用接口,而nodes它本身要么列出了一个接口,要么列出了多种类型的联合。

如果您确保所有类型 ,TypeN都在实现一个包含您要检查的字段的接口,那么您可以简单地在该接口上传播一个片段:

interface BaseType {
  id: ID!
  timestamp: DateTime
  content: String
}

type TypeA implements BaseType {
  id: ID!
  timestamp: DateTime
  content: String
  # ...
}

给定此接口,您可以查询实现此接口的每种类型:

{
  ... on BaseType { id timestamp content }
}

即使您不包括所有字段,这也将起作用。我假设content例如可能具有不同的类型,这意味着您不能一次在所有类型中查询它。


推荐阅读