如何在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




