当前位置: 首页 > 面试题库 >

使用TypeScript的React高阶组件的类型注释

阎俊英
2023-03-14
问题内容

我正在使用Typescript为我的React项目编写一个高阶组件,这基本上是一个函数,它接受React组件作为参数并返回一个环绕它的新组件。

然而,正如预期的那样,TS抱怨“导出函数的返回类型具有或正在使用私有名称” Anonymous class”。

有问题的功能:

export default function wrapperFunc <Props, State> (
    WrappedComponent: typeof React.Component,
) {
    return class extends React.Component<Props & State, {}> {
        public render() {
            return <WrappedComponent {...this.props} {...this.state} />;
        }
    };
}

该错误是合理的,因为未导出包装器函数的返回类,而其他模块导入则该函数无法知道返回值是什么。但是我无法在此函数外部声明返回类,因为它需要将组件传递包装到外部函数。

typeof React.Component像下面这样显式指定返回类型的试验确实可以消除此错误。

有问题的函数具有显式返回类型:

export default function wrapperFunc <Props, State> (
    WrappedComponent: typeof React.Component,
): typeof React.Component {                     // <== Added this
    return class extends React.Component<Props & State, {}> {
        public render() {
            return <WrappedComponent {...this.props} {...this.state} />;
        }
    };
}

但是,我不确定这种方法是否有效。它是解决TypeScript中特定错误的正确方法吗?(或者我是否在其他地方产生了意外的副作用?或者有其他更好的方法?)

(编辑)根据丹尼尔的建议更改引用的代码。


问题答案:

使用TypeScript的React高阶组件的类型注释

返回类型typeof React.Component是真实的,但对于包装组件的用户不是很有用。它丢弃有关组件接受什么道具的信息。

为此,React类型提供了一个方便的类型React.ComponentClass。它是类的类型,而不是从该类创建的组件的类型:

React.ComponentClass<Props>

(请注意,该state类型是内部细节,因此未提及)。

在您的情况下:

export default function wrapperFunc <Props, State, CompState> (
    WrappedComponent: typeof React.Component,
): React.ComponentClass<Props & State> {
    return class extends React.Component<Props & State, CompState> {
        public render() {
            return <WrappedComponent {...this.props} {...this.state} />;
        }
    };
}

但是,您在使用WrappedComponent参数做相同的事情。根据您在内部使用它的方式render,我猜测还应该声明它:

WrappedComponent: React.ComponentClass<Props & State>,

但这是一个大胆的猜测,因为我认为这不是完整的功能CompState未使用,并且Props & State可能是单个类型参数,因为它始终以该组合形式出现)。



 类似资料:
  • 我有一个HOC,它为包装的组件提供一个属性。 我想写的打字稿类型定义,正确地公开由这个HOC创建的组件的道具类型:基本上复制(推断)包装组件的道具类型,并删除我的HOC提供的属性。有可能吗? 在下面的示例中,我有一个HOC,它为任何接受它的包装组件提供了prop。因此,组件应该有props,不包括,这意味着只有。然而TypeScript显然仍然认为组件也应该获得属性。 我使用Typescript

  • 我对打字稿非常兴奋。如何设置函数参数的类型? 我怎样才能更好地输入?我想指定它必须是一个接受数字并返回数字的函数。 然后我能为这种类型做一个“接口”或一些简写,这样我就能让我的高阶函数签名更具可读性吗?

  • 我正在用TypeScript编写一个React高阶组件(HOC)。HOC应该比包装组件多接受一个道具,所以我写了以下内容: 换句话说,是一个生成实际hoc的函数。这个HOC(我相信)是一个接受

  • 使用任意数量的属性定义任何类型的简单react函数组件时出现类型脚本错误,包括使用FC、ComponentWithChildren等... 这是一个最小的复制品 给了我错误 类型“({ className }: { className?:未定义;}) = 我不明白这就是我总是定义组件的方式。打字稿中有什么我不知道的新东西吗?

  • 本文向大家介绍写一个react的高阶组件并说明你对高阶组件的理解相关面试题,主要包含被问及写一个react的高阶组件并说明你对高阶组件的理解时的应答技巧和注意事项,需要的朋友参考一下 定义高阶组件 import React, { Component } from 'react'; const simpleHoc = WrappedComponent => { console.log('simple

  • Examples Using the `withRouter` utility 如果你想应用里每个组件都处理路由对象,你可以使用withRouter高阶组件。下面是如何使用它: import { withRouter } from 'next/router' const ActiveLink = ({ children, router, href }) => { const style =