【问题标题】:How can I manually map apollo custom scalars to client side types如何手动将 apollo 自定义标量映射到客户端类型
【发布时间】:2021-02-26 09:18:18
【问题描述】:

如何手动将 apollo 自定义标量映射到客户端类型?

我不想更改与字段策略关联的类型。 (我正在尝试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;

如何手动将 apollo 自定义标量映射到客户端类型?

【问题讨论】:

    标签: typescript graphql apollo apollo-client


    【解决方案1】:

    引用 this TS issue 我能够使用导入语法以下列方式手动映射我的类型:

    type GraphQLDateTime = import('@types/luxon').DateTime
    

    现在在我的代码created 中(已通过FieldPolicy 转换为正确的类型。

    【讨论】:

    • 非常有用!你知道如何通过TypePolicies 转换某种类型的所有字段吗?还是必须为包含自定义标量类型的所有字段添加类型策略?
    • 根据我之前的研究,我认为没有稳定/受支持的方法可以做到这一点。您需要手动映射自定义标量。对此的 apollo github 问题是 here。里面提到了一些插件,但它们看起来有点老套。
    猜你喜欢
    • 2022-11-04
    • 2011-10-22
    • 2021-04-02
    • 2011-03-05
    • 2018-07-11
    • 2018-01-02
    • 2020-01-28
    • 2017-05-01
    • 2020-01-01
    相关资源
    最近更新 更多