Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSX element type does not have any construct or call signatures. Typescript

Tags:

typescript

In case compose is used there is an error JSX element type ‘Option’ does not have any construct or call signatures. 'redux' version - 3.7.2

import * as React from 'react';
import { compose } from 'redux';
import { connect } from 'react-redux';
const { connect: fela, withTheme } = require('react-fela');

const Option = compose(
    ...[
        connect(null,
            dispatch => ({
                onClick: (name) => dispatch(setActive(name)),
            })),
        fela({
            option: ({ theme }) => ({
                ...getControlOptionColors(theme),
            }),
        }),
    ],
)(withTheme(({ label, name, onClick, styles }) => (
    <div className={styles.option} onClick={onClick.bind(this, name)}>{label}</div>
)));

export class Test extends React.PureComponent<any, any> {

    private renderOptions(options) {
        return (
            <div className={this.props.styles.options}>
                {options.map(option => (
                    <div key={option.value}>
                        <Option
                            label={option.label}
                            name={option.value}
                        />
                    </div>
                ))}
            </div>
        );
    }


    public render() {
        const { options } = this.props;
        return (
            <div className={this.props.styles.container}>
                {this.renderOptions(options)}
            </div>
        );
    }
}

export default Controls;

Without compose, Everything work fine.

const Element = withTheme(({ label, name, onClick, styles }) => (
        <div className={styles.option} onClick={onClick.bind(this, name)}>{label}</div>
    ))

const conponentWithConnect = connect(null,
    dispatch => ({
        onClick: (name) => dispatch(setActive(name)),
    }))(Element);

const Option = fela({
        option: ({ theme }) => ({
                    ...getControlOptionColors(theme),
        }),
    })(withConnect)
like image 465
Люда Дзюбинска Avatar asked Feb 09 '18 07:02

Люда Дзюбинска


2 Answers

You need to type cast the component returned by compose as React.ComponentType and it works fine. So:

compose(...)(SomeComponent) as React.ComponentType
like image 74
ThisKappaIsGrey Avatar answered Oct 20 '22 03:10

ThisKappaIsGrey


An updated answer; use the generics for compose:

import React, { ComponentType, FC } from 'react';

export default compose<ComponentType>(
  withWidth,
  connect(
    mapStateToProps,
    mapDispatchToProps
  )
)(Search)
like image 42
Tobin Avatar answered Oct 20 '22 03:10

Tobin