您将希望改为使用React.ComponentType该类型:
const withLoader = <P extends object>(WrappedComponent: React.ComponentType<P>, loading: boolean) => {
// ...
}
不过请注意,如果您打算loading通过状态更改来切换 的值,则需要将其作为道具传递。这是因为每次调用withLoader以获取增强组件时,它都是一个新组件,这意味着如果您在内部执行此操作render,React 将始终卸载并重新安装该渲染组件。这也意味着增强组件内部的任何状态都将丢失。
例如:
interface WithLoadingProps {
loading: boolean;
}
const withLoader = <P extends object>(
WrappedComponent: React.ComponentType<P>
) => {
return class WithLoading extends React.Component<P & WithLoadingProps, any> {
render() {
const { loading } = this.props;
return (
<div>
<div className={loading ? "loader" : ""}>
<WrappedComponent {...this.props} />
</div>
</div>
);
}
};
};
样品用途:
const MyComponent = ({ text }: { text: string }) => {
return <div>{text}</div>;
};
const MyLoadingComponent = withLoader(MyComponent);
class Foo extends React.Component<{}, { loading: boolean }> {
render() {
const { loading } = this.state;
return <MyLoadingComponent loading={loading} text="foo" />;
}
}
最重要的是,还可以考虑displayName 按照 React 文档中的说明添加- 这将增强您在使用 React 开发工具时的调试体验。
和:

没有:

interface WithLoadingProps {
loading: boolean;
}
const getDisplayName = <P extends object>(Component: React.ComponentType<P>) =>
Component.displayName || Component.name || "Component";
const withLoader = <P extends object>(WrappedComponent: React.ComponentType<P>) => {
class WithLoading extends React.Component<P & WithLoadingProps, any> {
static readonly displayName = `WithLoading(${getDisplayName(WrappedComponent)})`;
render() {
const { loading } = this.props;
return (
<div>
<div className={loading ? "loader" : ""}>
<WrappedComponent {...this.props} />
</div>
</div>
);
}
}
return WithLoading;
};