困惑为什么 returnPartialData 在 Apollo Client 3 中没有字段策略的情况下工作

Confused why returnPartialData works without a field policy in Apollo Client 3

在我的应用程序中,我正在搜索产品,然后单击产品以查看有关它的更多详细信息。

我在每个页面上执行 GraphQL 查询。 SEARCH 查询 return 类型 [Product]PRODUCT 查询 return 类型 Product.

// Search page
const SEARCH = gql`
  query Search($query: String!) {
    searchResults: search(query: $query) {
      id
      name
      images
      price
    }
  }
`

// ProductDetail page
const PRODUCT = gql`
  query Product($id: Int!) {
    product(id: $id) {
      id
      name
      images
      optionSetName
      options {
        id
        images
        name
      }
      price
    }
  }
`

我在 PRODUCT 查询上启用了 returnPartialData,因为该产品的一些字段已经存在于 SEARCH 查询的缓存中,我想访问他们在服务器请求 returns.

之前

我想我还必须 apply a field policy 来引用先前存在的 Product,因为我不知道 PRODUCT 甚至知道它是什么 return类型是。

但是,当我执行以下操作时:

const { loading, data: { product } = {} } = useQuery(
    PRODUCT,
    { variables: { id: productId, isShallow }, returnPartialData: true }
)
console.log(product)

以下记录到控制台(第一个来自 returnPartialData,第二个来自服务器):

不知何故 PRODUCT 查询已将自身与现有的 Product 相关联,而无需我明确编写缓存重定向。

我很困惑这是怎么发生的?似乎 Apollo 必须引用 GraphQL 模式,并且已经看到 PRODUCT 的 return 类型是 Product,然后自动使用 id arg 来引用现有的产品。

使用"@apollo/client": "^3.4.1"

哇,原来我很久以前制定了一项现场政策,后来忘记了...xD

    typePolicies: {
      Query: {
        fields: {
          product: {
            read (_, { args, toReference }) {
              return toReference({
                __typename: 'Product',
                id: args.id
              })
            }
          }
        }
      }
    }