如何手动将 apollo 自定义标量映射到客户端类型
Posted
技术标签:
【中文标题】如何手动将 apollo 自定义标量映射到客户端类型【英文标题】:How can I manually map apollo custom scalars to client side types 【发布时间】:2021-02-26 09:18:18 【问题描述】:?
我不想更改与字段策略关联的类型。 (我正在尝试essentially do this,即手动添加对自定义标量类型的支持)。来自服务器的值是 string
但我不想将其转换为 JS 数据(更具体地说是 luxon
DateTime
)
我有这样的架构:
export interface SomeType
__typename: "SomeType";
created: GraphQLDateTime;
我有这样的现场政策:
import DateTime from 'luxon'
const cache = new InMemoryCache(
typePolicies:
SomeType:
fields:
created:
read: (created: string): DateTime => DateTime.fromISO(created)
)
我有一个graphqlScalars.d.ts
类型文件来提供自定义类型到 JS 类型的映射:
type GraphQLDateTime = string
我无法将我的类型定义文件切换为类似的文件,因为它会导致导入问题:
type GraphQLDateTime = DateTime
问题是,字段解析器按预期工作(即,它将我的 ISO8601 字符串转换为 luxon
DateTime
)但 TS
键入系统(因为 graphqlScalars.d.ts
类型定义)需要 created
成为string
所以DateTime
打字不可用。
这是read
函数的输入:
export declare type FieldReadFunction<TExisting = any, TReadResult = TExisting> = (existing: SafeReadonly<TExisting> | undefined, options: FieldFunctionOptions) => TReadResult | undefined;
?
【问题讨论】:
【参考方案1】:引用 this TS
issue 我能够使用导入语法以下列方式手动映射我的类型:
type GraphQLDateTime = import('@types/luxon').DateTime
现在在我的代码created
中(已通过FieldPolicy
转换为正确的类型。
【讨论】:
非常有用!你知道如何通过TypePolicies
转换某种类型的所有字段吗?还是必须为包含自定义标量类型的所有字段添加类型策略?
根据我之前的研究,我认为没有稳定/受支持的方法可以做到这一点。您需要手动映射自定义标量。对此的 apollo github 问题是 here。里面提到了一些插件,但它们看起来有点老套。以上是关于如何手动将 apollo 自定义标量映射到客户端类型的主要内容,如果未能解决你的问题,请参考以下文章
Apollo Graphql 自定义标量 JSON - 抱怨“TypeError:type.getFields 不是函数”
Apollo graphQL:在 iOS swift 中使用自定义标量时解码数组时出错
java - 如何将responseEntity映射到java中的自定义类