reactjs - 如何正确使用 react-redux 与 typescript@3 连接?
问题描述
我正在尝试使用 TypeScript 和 react-redux 创建类型安全的 HOC。
hoc/with-is-visible-range.tsx
import React from "react";
import { Subtract } from "utility-types";
import { connect } from "react-redux";
import { rangeVisibilitySelector } from "./date-range.selectors";
interface IInjectedProps {
visible: boolean;
}
interface IMappedProps {
isVisible: boolean;
}
const withIsVisibleRange = <T extends IInjectedProps>(
Component: React.ComponentType<T>
) => {
const WrappedComponent: React.SFC<
Subtract<T, IInjectedProps> & IMappedProps
> = ({ isVisible, ...rest }: IMappedProps) => {
return <Component {...rest} visible={isVisible} />;
};
const mapStateToProps = (state: ApplicationState) => ({
isVisible: rangeVisibilitySelector(state)
});
return connect(
mapStateToProps,
null
)(WrappedComponent);
};
export default withIsVisibleRange;
但我总是得到同样的错误:
错误信息:
错误:(30, 5) TS2345:“StatelessComponent> & IMappedProps>”类型的参数不可分配给“ComponentType> & IMappedProps>>”类型的参数。类型 'StatelessComponent> & IMappedProps>' 不可分配给类型 'StatelessComponent> & IMappedProps>>'。类型 'Pick> & IMappedProps' 不可分配给类型 'Matching<{ isVisible: boolean; } & null, Pick> & IMappedProps>'。类型 '(Pick> & IMappedProps)[P]' 不能分配给类型 'P extends "isVisible" ?({ isVisible: boolean; } & null)[P] 扩展 (Pick> & IMappedProps)[P] ? (Pick> & IMappedProps)[P] : ({ ...; } & null)[P] : (Pick<...> & IMappedProps)[P]'。
解决方案
虽然 in 声明中使用的类型操作(等Matching
)适用于任何给定的 props 类型,但 TypeScript 编译器无法象征性地推断当它们应用于涉及类型参数的 props 类型时会发生什么。不幸的是,您必须使用类型断言,即.connect
@types/react-redux
T
WrappedComponent as any
推荐阅读
- jquery - Github 将多个文件合并为单个压缩主文件
- javascript - 如何在垂直标签内容框的div内显示d3js图表?
- c++ - 检查模板参数是否“可调用”的 C++11 方法
- ignite - 点燃丢失的桌子
- java - 什么时候实现WebMvcConfigurer来配置Spring MVC?
- asp.net - 在 ASP.NET Webapp 中启用 Windows 身份验证
- python - 比较 2 个列表的元素并仅打印不同的元素
- xamarin - 带有自定义导航的 WebView 没有出现在 Xamarin 表单中
- python - 如何将环境变量从 .env 文件传递给 supervisord
- regex - 如何使用 sed 命令删除短语后的数字和日期时间?