如何手动将 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中的自定义类

如何在 apollo 的 graphql-gql 中使用从 npm 包导入的自定义 graphQL 类型

Entityframework 6:如何将自定义类型映射到 SQL 表