फ़ाइल Property has no initializer and is not definitely assigned in the constructorमें कुछ कॉन्फ़िगरेशन जोड़ते समय हमें संदेश मिल सकता है tsconfig.jsonताकि एक कोणीय परियोजना को सख्त मोड में संकलित किया जा सके:
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"noImplicitThis": true,
"alwaysStrict": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictPropertyInitialization": true,
दरअसल कंपाइलर शिकायत करता है कि उपयोग किए जाने से पहले एक सदस्य चर को परिभाषित नहीं किया गया है।
एक सदस्य चर के एक उदाहरण के लिए, जो संकलन समय पर परिभाषित नहीं है, एक सदस्य चर जिसमें एक @Inputनिर्देश है:
@Input() userId: string;
हम वैरिएबल वैकल्पिक हो सकते हैं कहकर कंपाइलर को चुप करा सकते हैं:
@Input() userId?: string;
लेकिन फिर, हमें चर के मामले को परिभाषित नहीं करने से निपटना होगा, और कुछ ऐसे बयानों के साथ स्रोत कोड को अव्यवस्थित करना होगा:
if (this.userId) {
} else {
}
इसके बजाय, इस सदस्य चर के मूल्य को जानना समय में परिभाषित किया जाएगा, अर्थात, इसका उपयोग किए जाने से पहले परिभाषित किया जाएगा, हम संकलक को बता सकते हैं कि इसे परिभाषित नहीं होने के बारे में चिंता न करें।
संकलक को यह बताने का तरीका ! definite assignment assertionऑपरेटर को जोड़ना है , जैसे:
@Input() userId!: string;
अब, संकलक समझता है कि यह चर, हालांकि संकलन समय पर परिभाषित नहीं है, इसे रन-टाइम पर और समय से पहले परिभाषित किया जाएगा।
यह अब उपयोग किए जाने से पहले इस चर को परिभाषित करने के लिए सुनिश्चित करने के लिए आवेदन पर निर्भर है।
एक अतिरिक्त सुरक्षा के रूप में, हम इसका उपयोग करने से पहले चर को परिभाषित कर सकते हैं, परिभाषित किया जा रहा है।
हम चर को परिभाषित कर सकते हैं परिभाषित किया गया है, अर्थात्, आवश्यक इनपुट बाइंडिंग वास्तव में कॉलिंग संदर्भ द्वारा प्रदान की गई थी:
private assertInputsProvided(): void {
if (!this.userId) {
throw (new Error("The required input [userId] was not provided"));
}
}
public ngOnInit(): void {
this.assertInputsProvided();
}
चर को परिभाषित करने के बाद, चर का उपयोग किया जा सकता है:
ngOnChanges() {
this.userService.get(this.userId)
.subscribe(user => {
this.update(user.confirmedEmail);
});
}
ध्यान दें कि ngOnInitइनपुट बाइंडिंग प्रयास के बाद विधि को कॉल किया जाता है, यह, भले ही बाइंडिंग को कोई वास्तविक इनपुट प्रदान नहीं किया गया हो।
जबकि ngOnChangesइनपुट बाइंडिंग के प्रयास के बाद विधि को कॉल किया जाता है, और केवल तभी बाइंडिंग के लिए वास्तविक इनपुट प्रदान किया जाता है।