reactjs - 将泛型传递给封装在 HOC 中的组件
问题描述
我有一个 ApolloGraphQL 查询组件的实现。
使用 Apollo 客户端查询组件时,可以这样传递类型:
import * as ApolloTypes from './__generated__/GetSubreddit';
<Query<ApolloTypes.GetSubreddit, ApolloTypes.GetSubredditVariables>
query={GET_SUBREDDIT}
variables={{ name: selectedSubreddit }}
>
...
</Query>
我有自己的组件,它实现了 Apollo Query 组件。除其他外,它为每个查询添加了一些标题。我希望能够以与普通查询组件相同的方式传递它的类型,这很容易在没有connect
来自“react-redux”的高阶组件的情况下完成。我不知道如何通过 HOC 传递泛型。有什么建议吗?
const GraphqlQuery = <T, TVariables = OperationVariables>(props: PropsType) => {
const { query, variables, children, user, ...rest } = props;
if (!user) return null;
return (
<Query<T, TVariables>
query={query}
variables={variables}
context={{
headers: {
"X-User-Id": user.id,
},
}}
{...rest}
>
...
</Query>
);
};
const mapStateToProps = ({ user }: { user: IUserState }) => ({
user,
});
export default connect(
mapStateToProps,
{}
)(GraphqlQuery);
解决方案
我可以想到有 2 个选项可以实现这一目标:
- 铸造出口:
在您的情况下,这可能会有些棘手,但只要 HOC 不需要任何道具,这样的事情就可以工作。如果是这样,您将不得不更改您要转换为的类型。
export default connect(
mapStateToProps,
{}
)(GraphqlQuery) as typeof GraphqlQuery
- 工厂
export const createGraphqlQuery = <T, TVariables = OperationVariables>() => {
const GraphqlQuery = (props: PropsType) => {
const { query, variables, children, user, ...rest } = props;
if (!user) return null;
return (
<Query<T, TVariables>
query={query}
variables={variables}
context={{
headers: {
"X-User-Id": user.id,
},
}}
{...rest}
>
...
</Query>
);
};
const mapStateToProps = ({ user }: { user: IUserState }) => ({
user,
});
return connect(
mapStateToProps,
{}
)(GraphqlQuery)
};
用法:
const GraphqlQuery = createGraphqlQuery<{}, {}>();
<GraphqlQuery ... />
每个人肯定都有权衡。
推荐阅读
- sharepoint-2013 - Sharepoint 2013 - 仅允许文档创建者编辑文档的权限
- r - 从第一列返回值以匹配条件
- deep-learning - 如何将 Jupyter Notebook 中的代码块导出到文本文件?
- docker - Nifi QueryDatabaseTable 处理器导致作为 Docker Image 运行的数据丢失
- ios - 切换音乐应用后,应用不再从锁定屏幕接收控制事件
- web - 哪个是根据用户处理视图的最佳选择?
- ios - iOS - 将视频合并到一帧与自己的帧
- java - 有没有办法用杰克逊定义一个通用的序列化方案?
- typescript - 链接 Observable 时的 RxJs 楼梯
- javascript - TypeScript - 以 Angular 覆盖 Youtube iframe 样式 4+