使用 TypeScript 反应 Apollo useQuery 钩子

Posted

技术标签:

【中文标题】使用 TypeScript 反应 Apollo useQuery 钩子【英文标题】:React Apollo useQuery hook with TypeScript 【发布时间】:2020-10-19 08:48:38 【问题描述】:

我正在尝试让 useQuery 挂钩与 TypeScript 一起使用。

这是我的查询

export const FETCH_LINKS = gql`
  query FetchLinks 
    feed 
      links 
        id
        createdAt
        url
        description
     
  

`;

我使用 graphql-codegen 从 GraphQL 模式生成类型

export type Feed = 
  __typename?: 'Feed';
  links: Array<Link>;
  count: Scalars['Int'];
;

export type Link = 
  __typename?: 'Link';
  id: Scalars['ID'];
  createdAt: Scalars['DateTime'];
  description: Scalars['String'];
  url: Scalars['String'];
  postedBy?: Maybe<User>;
  votes: Array<Vote>;
;

在我的组件中,我将类型应用于useQuery hook

const  data, loading, error  = useQuery<Feed>(FETCH_LINKS);

问题是在data 变量中,我收到了一个形状如下的对象:


feed: 
  __typename
  links
  count
  

因此,为了遍历链接数组并将它们呈现在页面上,我需要执行 data.feed.links.map()Feed 类型上没有 feed 属性,因此,我得到一个错误消息Property 'feed' does not exist on type 'Feed' 如何纠正这种不一致

【问题讨论】:

显而易见的解决方案是编辑 graphql-codegen 生成的 Feed 类型,但感觉不是正确的方法 试试useQuery&lt; feed: Feed &gt; 【参考方案1】:

由于您使用的是react-apollo 提供的钩子,因此您可能也应该使用官方的apollo cli 工具来生成类型-https://github.com/apollographql/apollo-tooling#apollo-clientcodegen-output。 Apollo codegen 可以开箱即用地生成正确的类型,而无需担心添加额外的插件。

【讨论】:

【参考方案2】:

如果您检查documentation,您会发现您需要再创建一个接口来表示数据:

interface FetchLinksData 
  feed: Feed[];

在组件中你可以这样使用:

const  data, loading, error  = useQuery<FetchLinksData>(FETCH_LINKS);
const feeds = data.feed;

【讨论】:

【参考方案3】:

除了typescript 插件之外,您还应该使用typescript-operations 插件。这样,您不仅会为架构中的 GraphQL 类型生成 TS 类型,还会根据您在客户端使用的实际查询生成类型。然后可以将这些附加类型直接插入到钩子使用的类型变量中。

或者,您也可以使用typescript-react-apollo 插件为您生成挂钩。

如果您不想使用任何其他插件,则需要自己为查询和变量构建适当的类型:

interface FetchLinksData 
  feed: Feed

【讨论】:

以上是关于使用 TypeScript 反应 Apollo useQuery 钩子的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Apollo 工具为查询生成 Typescript 类型,包括 Apollo @client 和 @rest 指令?

Apollo 的 TypeScript 类型使用Mutation 的 refetchQueries?

预期 0 个参数,但得到 1 个。使用 typescript 并从 react-apollo 撰写

使用命名变量反应 Apollo

如何在 TypeScript 中使用 Apollo Client 自定义钩子?

使用 Apollo 在 TypeScript 中填充常量时,对象的类型为“未知”.Vetur(2571)