如何将儿童类型传递给 HOC 反应的道具

Posted

技术标签:

【中文标题】如何将儿童类型传递给 HOC 反应的道具【英文标题】:How to pass children type to props of HOC react 【发布时间】:2020-04-28 13:37:16 【问题描述】:

我是 TypeScript 的新手,我正在努力编写带有 typecheck 的 HOC。 这是我的 HOC:

import React from 'react';
import Firebase from './Firebase';

export type FirebaseType = Firebase;

interface OwnProps 
  firebase: typeof Firebase;


const FirebaseContext = React.createContext(new Firebase());

export const withFirebase: React.FC = <T extends OwnProps>(
  Component: React.ComponentType<T>,
): React.ComponentType<T> => (props) => (
  <FirebaseContext.Consumer>
    (firebase: FirebaseType) => <Component ...props firebase=firebase />
  </FirebaseContext.Consumer>
);

export default FirebaseContext;

它会抛出一个错误:

类型'(组件:React.ComponentType)=> React.ComponentType' 不可分配给类型'FC'。种类 参数“组件”和“道具”不兼容。 类型 ' children?: ReactNode; ' 不可分配给类型 'ComponentType'。 类型 ' children?: ReactNode; ' 不可分配给类型 'FunctionComponent'。 类型 ' children?: ReactNode; ' 没有为签名 '(props: PropsWithChildren, context?: any): ReactElement ReactElement 组件)> |空) | (新的 (props: any) => 组件<...>)> |空'.ts(2322)

完全不知道如何继续使用此代码或如何使其工作。

有什么想法吗?

【问题讨论】:

亲爱的@VasylButov,您可以回复this post。也许它可以帮助你。 【参考方案1】:

以下是该错误的含义:

在您的类型定义中,您期望 withFirebase 具有与函数组件 (React.FC) 相同的类型签名,该函数组件接受 props 并返回一个 React 元素(或 null)。

但是,这不是您想要的 HOC,您希望它接收一个组件 (React.ComponentType) 并返回一个组件 (React.ComponentType)。

这应该可行:

type HOC = (Component: React.ComponentType) => React.ComponentType;
// Or, if you want to be more specific:
// type HOC = <T extends OwnProps>(Component: React.ComponentType<T>) => React.ComponentType<T>

export const withFirebase: HOC = <T extends OwnProps>(
  Component: React.ComponentType<T>,
): React.ComponentType<T> => (props) => (
  <FirebaseContext.Consumer>
    (firebase: FirebaseType) => <Component ...props firebase=firebase />
  </FirebaseContext.Consumer>
);

或者你也可以省略 HOC 类型,TypeScript 会从函数定义中推断出正确的类型。

【讨论】:

好的,非常感谢!这解决了 TS 错误,但是,如果我从其他文件导入 withFirebase(Component),它说我没有提供 firebase 道具(我在 HOC 中做过)并要求我隐式设置它。先生,我该如何解决? 将返回类型固定为React.ComponentType&lt;Omit&lt;T, keyof WithFirebase&gt;&gt; &amp; WithFirebase,似乎没问题!谢谢! 有没有办法从组件本身而不是 HOC 做到这一点?

以上是关于如何将儿童类型传递给 HOC 反应的道具的主要内容,如果未能解决你的问题,请参考以下文章

如何将道具从调用组件传递给 HOC - React + Typescript

测试传递给 Redux HOC 的强制 PropTypes

以编程方式将投影内容传递给儿童? (否则将呈现为 <ng-content> )

如何对儿童可见度的变化做出反应?

之间的区别是什么高阶组件(HOC)和继承反应本地组件

之间的区别是什么高阶组件(HOC)和继承反应本地组件