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'
如何纠正这种不一致
除了该插件之外,您还应该使用typescript-operationstypescript插件。这样,您不仅可以为架构中的 GraphQL 类型生成 TS 类型,还可以根据客户端使用的实际查询生成类型。然后可以将这些附加类型直接插入到钩子使用的类型变量中。
或者,您也可以使用typescript-react-apollo插件为您生成钩子。
如果您不想使用任何其他插件,则需要自己为查询和变量构建适当的类型:
interface FetchLinksData {
feed: Feed
}
Run Code Online (Sandbox Code Playgroud)
如果您查看文档,您会发现您需要再创建一个接口来表示数据:
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)
| 归档时间: |
|
| 查看次数: |
3560 次 |
| 最近记录: |