如何在带有typescript的函数中接受React.Component参数?

时间:2017-03-17 01:38:57

标签: reactjs generics typescript types

当我将React与TypeScript一起使用时,我通常会创建一个ES6类来定义一个类似的组件:

import * as React from 'react';

interface TextProps { text: string; }

export class Panel extends React.Component<TextProps, any> {
    constructor(props: TextProps) {
        super(props);
    }
    render() {
        return <div className="panel">{this.props.text}</div>;
    }
}

export class Label extends React.Component<TextProps, any> {
    constructor(props: TextProps) {
        super(props);
    }
    render() {
        return <span className="label">{this.props.text}</span>;
    }
}

我想要做的是创建一个同时接受PanelLabel的类型。

我尝试了以下内容:

type TextComp = React.Component<TextProps, any>;

function create(component: TextComp, text: string) {
    return React.createElement(component, { text: text });
}

这显示了React.createElement(component,参数上的编译器错误,但代码运行正常。

如何定义类型TextComp,以便使用TypeScript版本2.2.1编译此代码而不会出错?

1 个答案:

答案 0 :(得分:3)

你想要的是这个:

type TextComp = new(...args: any[]) => React.Component<TextProps, any>;

function create(component: TextComp, text: string) {
    return React.createElement(component, { text: text });
}

根本原因与What does the error "JSX element type '...' does not have any construct or call signatures" mean?

中解释的相同