【问题标题】:TS2604: JSX elemy type '' does not have any construct or call signaturesTS2604:JSX elemy 类型 '' 没有任何构造或调用签名
【发布时间】:2018-07-13 17:15:46
【问题描述】:

我在延迟加载组件的加载器上工作,但遇到了错误

TS2604:JSX elemy 类型“LoadedAsyncComponent”没有任何构造或调用签名

我认为我写了一个糟糕的代码,因为我最近开始写 React + TypeScript 链

这是我的组件:

import * as React from 'react';

declare interface AsyncComponentProps {
    moduleProvider: Function;
}
declare interface AsyncComponenState {
    LoadedAsyncComponent?: (React.Component<any, any> | null);
}

export class AsyncComponent extends React.Component<AsyncComponentProps, AsyncComponenState> {
    private isLoaded: boolean = false;
    constructor(props: any) {
        super(props);
        this.state = {
            LoadedAsyncComponent: null
        };
    }
    componentWillMount() {
        if (!this.isLoaded) {
            this.isLoaded = true;
            this.props.moduleProvider().then((provideData: any) => {
                this.setState({LoadedAsyncComponent: provideData[Object.keys(provideData)[0]] as React.Component});
            });
        }
    }
    render() {
        const {LoadedAsyncComponent} = this.state;
        return LoadedAsyncComponent ? <LoadedAsyncComponent/> : <div className="page-loading">Loading data</div>;
    }
}

错误在这里:

return LoadedAsyncComponent ? <LoadedAsyncComponent/> : <div className="page-loading">Loading data</div>;

另外moduleProvider prop 是一个导入承诺:

import(/* webpackChunkName: "home" */ './Home/Home')

【问题讨论】:

    标签: javascript reactjs typescript react-tsx


    【解决方案1】:

    我在更改该行时解决了这个问题:

    return LoadedAsyncComponent ? <LoadedAsyncComponent/> : <div className="page-loading">Loading data</div>;
    

    到:

    return LoadedAsyncComponent ? React.createElement(LoadedAsyncComponent, {} as any) : <div className="page-loading">Loading data</div>;
    

    并将AsyncComponent 状态下LoadedAsyncComponent 的类型从React.Component&lt;any,any&gt; 更改为React.ComponentClass,它现在对我有用...

    【讨论】:

    • 更新:只需将 LoadedAsyncComponent 类型切换为 ComponentClass 也可以:return LoadedAsyncComponent ? &lt;LoadedAsyncComponent/&gt; : &lt;div className="page-loading"&gt;Loading data&lt;/div&gt;;
    • @AluanHaddad 只是我认为这个解决方案并不完美。 ComponentClass 比 Component 更容易。而 AsyncComponent 需要延迟加载路由
    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2019-04-26
    • 2021-11-30
    • 2016-10-07
    • 2016-03-05
    • 2021-09-21
    相关资源
    最近更新 更多