如何在 Apollo 中解决远程 属性 的不同类型?

How to resolve a different type for a remote property in Apollo?

假设我有以下查询:

foo {
  id
  bar
  baz @client
}

我可以(事实上,我必须)创建一个解析器来生成本地 baz 属性。所以我控制它的数据类型。

现在,如果我想更改远程 属性 的 bar 的数据类型怎么办?

我想将 bar 设为 BigNumber 而不是字符串。想象一下这样的事情:

resolvers: {
  bar: {
    return new BigNumber(bar);
  },
  baz: { ... }
}

这可能吗?

TLDR;在大多数情况下,您不能这样做,因此通过创建具有正确数据类型的本地 属性 来增加一点冗余。


基本查询

不起作用

query Foo {
  id
  bar
  baz {
    id
  }
}

如果您添加这样的解析器:

export default {
  Foo: {
    bar: ({ bar }) => new BigNumber(bar),
  }
}

它不会工作。

@client 的基本查询

有效

query Foo {
  id
  bar
  baz {
    id
  }
  qux @client
}

只需添加另一个 属性,比如 qux,它具有 @client 指令,您将触发上面定义的 bar 解析器。

带片段的复杂查询

不起作用

如果您像这样重写查询:

fragment Baz on Foo {
  id
}

query Foo {
  id
  bar
  qux @client
  ...Baz
}

它将不再有效,即使使用@client 指令也是如此。


我的环境:

  • apollo-cache-inmemory@^1.6.3
  • apollo-client@^2.6.4
  • 阿波罗-link-http@^1.5.16
  • graphql@^14.5.8
  • graphql-tag@^2.10.1

我正在连接到 thegraph.com 上托管的区块链子图。 YMMV.