You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Apollo中修改远程属性的数据类型?将string转为BigNumber可行吗?

当然可以!你这个思路完全行得通——在GraphQL生态里,自定义resolver正是用来处理这类字段类型转换、本地字段扩展的场景。

具体实现步骤

首先要注意resolver的结构:针对远程返回的bar字段做类型转换,你需要把resolver挂载到对应类型的字段下,而不是单独的顶层键。假设你的foo查询返回的是Foo类型(这是GraphQL schema里定义的类型名称,大小写敏感),那么正确的resolver写法应该是这样的:

import BigNumber from 'bignumber.js'; // 确保已安装并导入库

const resolvers = {
  Foo: {
    // 处理远程字段bar的类型转换:string → BigNumber
    bar: (parent) => {
      // parent是远程服务返回的原始foo对象,包含string类型的bar
      return new BigNumber(parent.bar);
    },
    // 处理本地客户端字段baz的逻辑
    baz: (parent) => {
      // 这里写你的baz生成逻辑,比如基于parent的其他字段计算
      return /* 你的本地字段值,比如 parent.id + '-custom' */;
    }
  }
};
关键注意点
  • 类型名称匹配:一定要保证resolver里的Foo和你GraphQL schema中foo字段返回的类型名称完全一致(包括大小写),否则GraphQL找不到对应的resolver。
  • 参数使用parent参数会传递远程返回的原始数据对象,你可以直接从中取出原始的bar字符串来实例化BigNumber。
  • 客户端兼容性:如果你用的是Apollo Client这类客户端,只需要把这个resolver对象配置到客户端实例的resolvers选项里即可,客户端会自动在获取远程数据后执行类型转换,再处理本地@client字段。
  • 依赖准备:记得提前安装bignumber.js或者你使用的BigNumber类库,避免运行时找不到构造函数的错误。

这样配置后,当你执行foo { id bar baz @client }查询时,返回的bar就会是BigNumber类型,而baz则按你的本地逻辑生成,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Paul Razvan Berg

火山引擎 最新活动