【发布时间】: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
更新:
我发现删除泛型类型<{}, null> 可以清除错误。但我仍然很想知道为什么会出现错误。
【问题讨论】:
-
如果App组件不使用状态,其实可以把它变成一个功能性的无状态组件。
-
@D-reaper
App在我的情况下确实使用了状态。我正在使用redux来管理状态。我想这就是为什么我不必明确写prevState()? -
我认为既然您将
null作为 React.Component 中的第二个类型参数传递,它定义了状态的结构并且它仅与某些类型(例如对象)兼容,因此导致 TS抛出那个错误。<any, any>或只是<{}>也可以。
标签: reactjs typescript2.0