使用 TypeScript 响应 Apollo useQuery 钩子

Ale*_*min 3 typescript reactjs graphql react-apollo apollo-client

我正在尝试让useQuery钩子与 TypeScript 一起工作。

这是我的查询

export const FETCH_LINKS = gql`
  query FetchLinks {
    feed {
      links {
        id
        createdAt
        url
        description
     }
  }
}
`;
Run Code Online (Sandbox Code Playgroud)

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

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>;
};

Run Code Online (Sandbox Code Playgroud)

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

const { data, loading, error } = useQuery<Feed>(FETCH_LINKS);
Run Code Online (Sandbox Code Playgroud)

问题是在data变量中我收到了以下形状的对象:

{
feed: {
  __typename
  links
  count
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*den 6

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

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

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

interface FetchLinksData {
  feed: Feed
}
Run Code Online (Sandbox Code Playgroud)


Iva*_*vic 6

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

interface FetchLinksData {
  feed: Feed[];
}
Run Code Online (Sandbox Code Playgroud)

在组件中,您可以像这样使用它:

const { data, loading, error } = useQuery<FetchLinksData>(FETCH_LINKS);
const feeds = data.feed;
Run Code Online (Sandbox Code Playgroud)