TLDR;状态不能为空。为其声明一个接口或声明它{}
答案在于@ types / react
看一下定义,state和props都不打算为空。
当你宣称App的class App extends React.Component<{}, null> {,你本质上说,“状态的类型是空的”。
现在,的类型setState取决于您为状态指定的类型,并且与鲜为人知的setStateapi版本冲突。prevstate声明为{}(默认值,因为未指定状态的接口),它与null不兼容,从而导致您看到错误日志。
解决方法我正在使用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<{},callback?: (() => any) | undef...’. Types of parameters ’f’ and ’f’ are incompatible.Type ’(prevState: {},any>’ is not assignable to type ’(prevState: 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.0npm v5.1.0typescript v2.4.1react v15.6.1redux v3.7.1react-redux v5.0.5react-scripts-ts v2.3.2
更新:
我发现删除通用类型可以<{},null>清除错误。但是我仍然很想学习为什么我得到了错误。