TypeScript:JSX 元素类型没有任何构造或调用签名

IT技术 reactjs typescript
2021-05-10 05:43:34

我正在使用 React 16.2.0、TypeScript 2.7.1,并且任何类型都不允许。

主要成分:

// index.js

import * as React from 'react'
import Page from './page'
import i18n from '../i18n'

import PageContent from '../components/pageContent'
import withMoreInfo from '../hoc/withMoreInfo'

class Home extends React.Component {
  render () {
    return <Page title={ i18n.t('home.title') }>
      <PageContent />
    </Page>
  }
}

export default withMoreInfo(Home)

临时文件:

import * as React from 'react'

export default function withMoreInfo<T> (Wrapped: T) {
  return class WithMoreInfo extends React.Component<{ asPath: string }> {
    static async getInitialProps ({ asPath }: { asPath: string }) {
      return { asPath }
    }

    render () {
      const { asPath } = this.props
      const language = asPath.indexOf('/ro') === 0 ? 'ro' : 'en'
      return <Wrapped language={ language } pathname={ asPath } />
    }
  }
}

我无法解决此错误: error #TS2604: JSX element type 'Wrapped' does not have any construct or call signatures.

在此处输入图片说明

非常感谢任何提示。谢谢,保罗

2个回答

您需要告诉编译器该参数是一个构造函数,并返回一个带有属性languagepathname

function withMoreInfo<T extends React.Component<{ language: string, pathname: string }, any>>(Wrapped: new (props: { language: string, pathname: string }, context?: any) => T) {
    return class WithMoreInfo extends React.Component<{ asPath: string }> {
        static async getInitialProps({ asPath }: { asPath: string }) {
            return { asPath }
        }

        render() {
            const { asPath } = this.props
            const language = asPath.indexOf('/ro') === 0 ? 'ro' : 'en'
            return <Wrapped language={language} pathname={asPath} />
        }
    }
}
// The component must have properties language and pathname and only those
class Home extends React.Component<{ language: string, pathname: string }> {
    render() {
        return <div />
    }
}

export default withMoreInfo(Home)

在您调用时的原始版本中withMoreInfo(Home), ,T确实是一个react组件,但是您也可以调用它,withMoreInfo(1)因为T它不受任何限制。泛型函数对于传递给它的任何类型都必须是正确的,因此编译器认为T可能是任何东西,因此它可以可靠地不说什么。解决方案是让编译器知道,Wrapped参数是react组件的构造函数,即任何T具有属性的react组件{ language: string, pathname: string }构造函数具有与常规函数类似的签名声明,只是使用new关键字,因此new (props: { language: string, pathname: string }, context?: any) => T

将答案放在这里是因为它通常与错误相关。

new在类型定义中丢失了。

some-js-component.d.ts 文件:

import * as React from "react";

export default class SomeJSXComponent extends React.Component<any, any> {
    new (props: any, context?: any)
}

tsx在我试图导入无类型组件文件中:

import SomeJSXComponent from 'some-js-component'

...inside render()
   return (
        <React.Fragment>
            <SomeJSXComponent withProps={asdf} />
        </React.Fragment>
   );