2017-07-11 13 views
8

मैं Microsoft TypeScript-React-Starter का उपयोग कर रहा है और इस संकलन त्रुटि मिली हैं:जेएसएक्स तत्व प्रकार 'ऐप' जेएसएक्स तत्वों के लिए एक कन्स्ट्रक्टर फ़ंक्शन नहीं है। संपत्ति 'setState' के प्रकार <code>npm start</code> दौरान असंगत

./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> को हटाने त्रुटि को साफ करता है। लेकिन मुझे अभी भी यह जानना अच्छा लगेगा कि मुझे त्रुटि क्यों मिल रही थी।

+0

यदि ऐप घटक राज्य का उपयोग नहीं करता है, तो आप वास्तव में इसे एक कार्यात्मक स्टेटलेस घटक बना सकते हैं। –

+0

@ डी-रीपर 'ऐप' मेरे मामले में राज्य का उपयोग करता है। मैं राज्य का प्रबंधन करने के लिए 'redux' का उपयोग कर रहा हूँ। मुझे लगता है कि मुझे स्पष्ट रूप से 'prevState()' लिखना नहीं है? – CherryQu

+1

मुझे लगता है कि आप React.Component में दूसरे प्रकार के तर्क के रूप में 'शून्य' को पार कर रहे हैं, जो राज्य की संरचना को परिभाषित करता है और यह केवल कुछ प्रकारों (उदा। ऑब्जेक्ट) के साथ संगत है जिससे टीएस को उस त्रुटि को फेंकने का कारण बनता है। '' या बस '<{}> 'भी काम करेगा। –

उत्तर

10

टीएलडीआर; राज्य शून्य नहीं हो सकता है। इसके लिए एक इंटरफेस घोषित या घोषित यह {}

उत्तर definition को देखते हुए @types/react

में निहित है, न तो राज्य और न ही रंगमंच की सामग्री अशक्त होने के लिए लक्षित नहीं हैं।

जब आप Appclass App extends React.Component<{}, null> { रूप में घोषित किया, आप अनिवार्य रूप से कहा, "राज्य प्रकार अशक्त की है।"

अब setState के प्रकार आप राज्य के लिए निर्दिष्ट प्रकार पर निर्भर है और यह lesser known version of the setState api से बहस हुई। prevState को {} (डिफ़ॉल्ट, क्योंकि राज्य के लिए कोई इंटरफ़ेस निर्दिष्ट नहीं किया गया था) के रूप में घोषित किया गया है जो शून्य के साथ संगत नहीं है, जिससे आपके द्वारा देखा गया त्रुटि लॉग होता है।

+2

चूंकि [यह पीआर] (https://github.com/DefinitelyTyped/DefinitelyTyped/pull/17288) विलय कर दिया गया था, प्रकार पैरामीटर को छोड़कर घटक को प्रोप और राज्य डिफ़ॉल्ट ('{}', ' {} ')। टीएस> 2.3 मानता है। – Cory

+0

बस एक नोट है कि हमें यह 'शून्य' का उपयोग करके भी मिला है। पूरी तरह से राज्य तर्क को हटाकर और संपत्ति तर्क का उपयोग करके संकलक फिर से खुश हो जाता है। – icfantv

संबंधित मुद्दे