2017-02-07 20 views
6

नवीनतम @types/react (v15.0.6) के साथ प्रकार उठाओ setState, अर्थात् Pick<S, K> के लिए टाइपप्रति 2.1 में अतिरिक्त सुविधाओं का उपयोग करें। जो अच्छी बात है, क्योंकि अब टाइपिंग सही हैं, क्योंकि अद्यतन टाइपिंग से पहले "पता नहीं था" setState इसे बदलने के बजाय this.state विलय कर रहा है। गतिशील/गणना की कुंजी

इसके अलावा, Pick का उपयोग setState फ़ंक्शन को अनुमति इनपुट के मामले में बहुत सख्त बनाता है। यह अब state कि घटक परिभाषा (React.Component के दूसरे सामान्य में परिभाषित नहीं कर रहे हैं करने के लिए गुण जोड़ने के लिए संभव है

लेकिन यह भी एक गतिशील अद्यतन हैंडलर परिभाषित करना कठिन है उदाहरण के लिए:।।

import * as React from 'react'; 


interface Person { 
    name: string; 
    age: number|undefined; 
} 


export default class PersonComponent extends React.Component<void, Person> { 
    constructor(props:any) { 
    super(props); 

    this.state = { 
     name: '', 
     age: undefined 
    }; 
    this.handleUpdate = this.handleUpdate.bind(this); 
    } 

    handleUpdate (e:React.SyntheticEvent<HTMLInputElement>) { 
    const key = e.currentTarget.name as keyof Person; 
    const value = e.currentTarget.value; 
    this.setState({ [key]: value }); 
    } 

    render() { 
    return (
     <form> 
     <input type="text" name="name" value={this.state.name} onChange={this.handleUpdate} /> 
     <input type="text" name="age" value={this.state.age} onChange={this.handleUpdate} /> 
     </form> 
    ); 
    } 
} 

setState समारोह निम्न त्रुटि

[ts] Argument of type '{ [x: string]: string; }' is not assignable 
    to parameter of type 'Pick<Person, "name" | "age">'. 
     Property 'name' is missing in type '{ [x: string]: string; }'. 

भले ही key के प्रकार "name" | "age" है फेंक देते हैं।

मैं इस के लिए एक समाधान है, एक अलग updateName और updateAge समारोह होने के अलावा अन्य नहीं मिल रहा। क्या किसी को गतिशील कुंजी मानों के साथ Pick का उपयोग करने का तरीका पता है?

उत्तर

5

तो अधिक शोध करने के बाद मैं उपरोक्त कोड में क्या हो रहा है पर थोड़ा और संदर्भ प्रदान कर सकता हूं।

जब आप const name = 'Bob' की तरह कुछ करने के चर name के प्रकार 'Bob' नहीं स्ट्रिंग है। हालांकि, अगर आप एक let (let name = 'Bob') के साथ const की जगह चर name प्रकार string का हो जाएगा।

इस अवधारणा को "चौड़ा" कहा जाता है। असल में, इसका मतलब है कि टाइप सिस्टम यथासंभव स्पष्ट होने की कोशिश करता है। क्योंकि const को पुन: असाइन नहीं किया जा सकता है टाइपस्क्रिप्ट सटीक प्रकार का अनुमान लगा सकता है। let कथनों को फिर से सौंप दिया जा सकता है। इस प्रकार, टाइपस्क्रिप्ट name के प्रकार के रूप में string (उपरोक्त उदाहरण में) का अनुमान लगाएगा।

वही const key = e.currentTarget.name as keyof Person के साथ हो रहा है। key (संघ) प्रकार "name"|"age" होगा, जो वही है जो हम चाहते हैं। लेकिन अभिव्यक्ति this.setState({ [key]: value }); चर key है में (गलत) एक string चौड़ी।


टीएल; डॉ; ऐसा लगता है कि टाइपस्क्रिप्ट में एक बग है। मैंने इस मुद्दे को गिथब रेपो और टाइपस्क्रिप्ट टीम is investigating the problem पर पोस्ट किया। :)

एक अस्थायी समाधान के रूप में आप कर सकते हैं:

this.setState({ [key as any]: value }); 
संबंधित मुद्दे