【问题标题】:JSX element type 'App' is not a constructor function for JSX elements. Types of property 'setState' are incompatibleJSX 元素类型“App”不是 JSX 元素的构造函数。属性“setState”的类型不兼容
【发布时间】:2017-07-11 02:49:34
【问题描述】:

我正在使用Microsoft TypeScript-React-Starter 并在npm start 期间收到此编译错误:

./src/index.tsx
(16,5): error TS2605: JSX element type 'App' is not a constructor function for JSX elements.
  Types of property 'setState' are incompatible.
    Type '{ <K extends never>(f: (prevState: null, props: {}) => Pick<null, K>, callback?: (() => any) | un...' is not assignable to type '{ <K extends never>(f: (prevState: {}, props: any) => Pick<{}, K>, callback?: (() => any) | undef...'.
      Types of parameters 'f' and 'f' are incompatible.
        Type '(prevState: {}, props: any) => Pick<{}, any>' is not assignable to type '(prevState: null, props: {}) => Pick<null, any>'.
          Types of parameters 'prevState' and 'prevState' are incompatible.
            Type 'null' is not assignable to type '{}'.

看来我的setState 函数签名不正确,但我不确定如何修复它。这是我的代码:

class App extends React.Component<{}, null> {
  render() {
    return (
      <div className="App">
        ...
      </div>
    );
  }
}

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root') as HTMLElement
);

我正在使用:

node v6.11.0
npm v5.1.0
typescript v2.4.1
react v15.6.1
redux v3.7.1
react-redux v5.0.5
react-scripts-ts v2.3.2

更新:

我发现删除泛型类型&lt;{}, null&gt; 可以清除错误。但我仍然很想知道为什么会出现错误。

【问题讨论】:

  • 如果App组件不使用状态,其实可以把它变成一个功能性的无状态组件。
  • @D-reaper App 在我的情况下确实使用了状态。我正在使用redux 来管理状态。我想这就是为什么我不必明确写prevState()
  • 我认为既然您将 null 作为 React.Component 中的第二个类型参数传递,它定义了状态的结构并且它仅与某些类型(例如对象)兼容,因此导致 TS抛出那个错误。 &lt;any, any&gt; 或只是 &lt;{}&gt; 也可以。

标签: reactjs typescript2.0


【解决方案1】:

TLDR;状态不能为空。为它声明一个接口或者声明它{}

答案在于@types/react

查看definition,无论是 state 还是 props 都不打算为 null。

当您将 App 声明为 class App extends React.Component&lt;{}, null&gt; { 时,您实质上是在说“状态的类型为 null”。

现在setState 的类型取决于您为状态指定的类型,它与lesser known version of the setState api 发生冲突。 prevState 被声明为与 null 不兼容的 {}(默认值,因为没有指定状态接口),导致您看到的错误日志。

【讨论】:

  • 由于this PR 被合并,省略类型参数将导致使用prop 和state 默认值({}{})创建组件。假设 TS > 2.3。
  • 请注意,我们也使用void 得到了这个。完全删除 state 参数并仅使用 property 参数会使编译器再次高兴。
【解决方案2】:

也许此修复不相关,但我收到了相同的错误消息,但在 class App extends React.Component 之后没有 &lt;{}, null&gt;。这是我的解决方案。

更改import React from 'react';

import * as React from 'react';

【讨论】:

  • 这是一个完全不同的问题,取决于您如何配置 allowSyntheticDefaultImports
  • @PaulGray 这实际上正是我遇到的问题。导入的文件没有正确导入 React,因此它没有被 TS 视为 React 组件。
  • 但这仍然是一个完全不同的问题:D
猜你喜欢
  • 2019-11-24
  • 2020-05-31
  • 2019-05-29
  • 2019-03-06
  • 2019-07-21
  • 2019-05-18
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
相关资源
最近更新 更多