डिफ़ॉल्ट घटक वर्ग घटक के साथ
का उपयोग करना static defaultPropsसही है। आपको प्रॉपर और स्टेट के लिए इंटरफेसेस का इस्तेमाल करना चाहिए, न कि क्लासेस का।
अपडेट 2018/12/1 : टाइपस्क्रिप्ट ने defaultPropsसमय के साथ संबंधित प्रकार की जाँच में सुधार किया है । पुराने उपयोगों और मुद्दों के लिए नीचे नवीनतम और सबसे बड़े उपयोग के लिए पढ़ें।
टाइपस्क्रिप्ट 3.0 और ऊपर के लिए
टाइपस्क्रिप्ट ने विशेष रूप से टाइप-चेकिंग कार्य करने के लिए समर्थन जोड़ा हैdefaultProps कि आप कैसे उम्मीद करेंगे। उदाहरण:
interface PageProps {
foo: string;
bar: string;
}
export class PageComponent extends React.Component<PageProps, {}> {
public static defaultProps = {
foo: "default"
};
public render(): JSX.Element {
return (
<span>Hello, { this.props.foo.toUpperCase() }</span>
);
}
}
जिसे प्रस्तुत किया जा सकता है और एक fooविशेषता को पारित किए बिना संकलित किया जा सकता है :
<PageComponent bar={ "hello" } />
ध्यान दें कि:
टाइपस्क्रिप्ट 2.1 के लिए 3.0 तक
इससे पहले कि टाइपस्क्रिप्ट 3.0 defaultPropsआपके लिए कंपाइलर समर्थन लागू करता है, तब भी आप इसका उपयोग कर सकते हैं, और इसने 100% प्रतिक्रिया के साथ रनटाइम पर काम किया है, लेकिन चूंकि टाइपस्क्रिप्ट केवल जेएसएक्स विशेषताओं की जांच करते समय आपको प्रॉपर माना जाता है, आपको उन प्रॉपर को चिह्नित करना होगा जिनके पास वैकल्पिक के रूप में चूक है ?। उदाहरण:
interface PageProps {
foo?: string;
bar: number;
}
export class PageComponent extends React.Component<PageProps, {}> {
public static defaultProps: Partial<PageProps> = {
foo: "default"
};
public render(): JSX.Element {
return (
<span>Hello, world</span>
);
}
}
ध्यान दें कि:
- यह एक अच्छा विचार है कि इसके
defaultPropsसाथ एनोटेट करें Partial<>ताकि यह आपके प्रॉप्स के खिलाफ टाइप-चेक करे, लेकिन आपको प्रत्येक आवश्यक संपत्ति को डिफ़ॉल्ट मान के साथ आपूर्ति करने की आवश्यकता नहीं है, जो कि कोई मतलब नहीं है क्योंकि आवश्यक गुणों को कभी भी डिफ़ॉल्ट की आवश्यकता नहीं होनी चाहिए।
- का उपयोग
strictNullChecksकरते समय this.props.fooहोगा possibly undefinedऔर हटाने के लिए एक गैर अशक्त (यानी this.props.foo!) या टाइप-गार्ड (यानी if (this.props.foo) ...) की आवश्यकता होगी undefined। यह डिफ़ॉल्ट प्रोप मूल्य के बाद से कष्टप्रद है इसका मतलब है कि यह वास्तव में अपरिभाषित नहीं होगा, लेकिन टीएस ने इस प्रवाह को नहीं समझा। कि मुख्य कारणों में से एक है TS 3.0 में स्पष्ट समर्थन जोड़ा गया है defaultProps।
टाइपस्क्रिप्ट 2.1 से पहले
यह समान काम करता है, लेकिन आपके पास Partialप्रकार नहीं होते हैं, इसलिए केवल Partial<>सभी आवश्यक प्रॉप्स के लिए डिफ़ॉल्ट मान और या तो डिफ़ॉल्ट मानों की आपूर्ति करें (भले ही उन डिफ़ॉल्ट का उपयोग कभी नहीं किया जाएगा) या स्पष्ट प्रकार एनोटेशन को पूरी तरह से छोड़ दें।
आप defaultPropsफ़ंक्शन घटकों पर भी उपयोग कर सकते हैं , लेकिन आपको अपना फ़ंक्शन FunctionComponent( संस्करण से पहले ) इंटरफ़ेस StatelessComponentमें टाइप करना होगा ताकि टाइपस्क्रिप्ट फ़ंक्शन के बारे में जान सके:@types/react16.7.2defaultProps
interface PageProps {
foo?: string;
bar: number;
}
const PageComponent: FunctionComponent<PageProps> = (props) => {
return (
<span>Hello, {props.foo}, {props.bar}</span>
);
};
PageComponent.defaultProps = {
foo: "default"
};
ध्यान दें कि आपको टीएस 2.1+ में आंशिक के रूप में पहले से निर्दिष्ट होने के Partial<PageProps>कारण कहीं भी उपयोग करने की आवश्यकता नहीं है FunctionComponent.defaultProps।
एक और अच्छा विकल्प (यह वही है जो मैं उपयोग करता हूं) अपने propsमापदंडों को नष्ट करना और डिफ़ॉल्ट मानों को सीधे असाइन करना है:
const PageComponent: FunctionComponent<PageProps> = ({foo = "default", bar}) => {
return (
<span>Hello, {foo}, {bar}</span>
);
};
तो फिर तुम बिल्कुल जरूरत नहीं है defaultProps! ध्यान रखें कि यदि आप एक फ़ंक्शन घटक पर प्रदान करते हैं, तोdefaultProps यह डिफ़ॉल्ट पैरामीटर मानों पर वरीयता लेगा, क्योंकि रिएक्ट हमेशा defaultPropsमानों को स्पष्ट रूप से पारित करेगा (इसलिए पैरामीटर कभी अपरिभाषित नहीं होते हैं, इस प्रकार डिफ़ॉल्ट पैरामीटर का उपयोग कभी नहीं किया जाता है।) तो आप उपयोग करेंगे। एक या दूसरे, दोनों नहीं।
static defaultPropsसही है। क्या आप उस कोड को पोस्ट कर सकते हैं?