प्रॉपर्टी '...' में कोई इनिशियलाइज़र नहीं है और इसे निश्चित रूप से कंस्ट्रक्टर में नहीं सौंपा गया है


132

मेरे कोणीय ऐप में मेरा एक घटक है:

import { MakeService } from './../../services/make.service';
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-vehicle-form',
  templateUrl: './vehicle-form.component.html',
  styleUrls: ['./vehicle-form.component.css']
})
export class VehicleFormComponent implements OnInit {
  makes: any[];
  vehicle = {};

  constructor(private makeService: MakeService) { }

  ngOnInit() {
    this.makeService.getMakes().subscribe(makes => { this.makes = makes
      console.log("MAKES", this.makes);
    });
  }

  onMakeChange(){
    console.log("VEHICLE", this.vehicle);
  }
}

लेकिन "बनाता है" संपत्ति में मुझसे एक गलती है। मुझे नहीं पता कि इसके साथ क्या करना है ...

ग़लती

जवाबों:


74

मुझे लगता है कि आप टाइपस्क्रिप्ट के नवीनतम संस्करण का उपयोग कर रहे हैं। कृपया "स्ट्रिक्ट क्लास इनिशियलाइज़ेशन" अनुभाग देखें link

इसे ठीक करने के दो तरीके हैं:

A. यदि आप VSCode का उपयोग कर रहे हैं तो आपको TS संस्करण को बदलने की आवश्यकता है जो संपादक उपयोग करता है।

B. जब आप इसे कंस्ट्रक्टर के अंदर घोषित करते हैं, तो सरणी को आरंभीकृत करें,

makes: any[] = [];

constructor(private makeService: MakeService) { 
   // Initialization inside the constructor
   this.makes = [];
}

क्षमा करें, मैं टाइपस्क्रिप्ट में नया हूं। क्या आप कह सकते हैं कि मेरी गलती कहाँ है?
माइकल कोस्टीचेंको

2
जैसा कि त्रुटि कहती है कि आपको चर को कुछ मूल्य बनाने के लिए आरंभीकृत करने की आवश्यकता है: कोई [] = [];
सजेतीचरण

1
टाइपस्क्रिप्ट बताने के लिए आपको 'निश्चित असाइनमेंट एश्योरेंस' का उपयोग करना होगा कि इस चर का रनटाइम पर एक मान होगा:makes!: any[];
हुसैन अकर

207

बस tsconfig.json पर जाएं और सेट करें

"strictPropertyInitialization": false

संकलन त्रुटि से छुटकारा पाने के लिए।

अन्यथा आपको अपने सभी वैरिएबल को इनिशियलाइज़ करने की आवश्यकता है जो थोड़ा कष्टप्रद है


3
बस यह सुनिश्चित करें कि आप "सख्त" के बाद जोड़ते हैं: सच है कि ट्रांसपिलर इसे फिर से चालू करता है (हालांकि वीएस को पता है कि यह बंद है)।
मोंटी

52
इस तरह आप सभी प्रोजेक्ट के लिए सख्त चेकिंग प्रॉपर्टी इनिशियलाइज़ेशन को डिसेबल कर देंगे। !चर नाम में पोस्टफ़िक्स ऑपरेटर को जोड़ना बेहतर है , बस इस मामले को अनदेखा करें, या निर्माणकर्ता के अंदर चर को इनिशियलाइज़ करें।
मत्तेओ ग्वारनेरियो

10
आप संभावित समस्याओं को अनदेखा करने का सुझाव दे रहे हैं जो संकलक के बारे में बता रहे हैं, यह वास्तव में सुरक्षित नहीं है। इतना नीच।
ओल्गा

6
StrictPropertyInitialzer एक ध्वज है जिसे टाइपस्क्रिप्ट 2.7 में पेश किया गया है। यदि आप इन सभी झंडों को सक्षम करना चाहते हैं और सभी नियमों का कड़ाई से पालन करना चाहते हैं या कुछ सत्यापन को बंद करना चाहते हैं, तो यह चुनना सभी के लिए है। यह पूरी तरह से हर बार सभी नियमों का पालन करने के लिए कोई मतलब नहीं है। यदि आपका कोड बहुत अधिक वर्बोज़ और डाउनसाइड हो जाता है और फायदे से बड़ा है तो आपको निश्चित रूप से इसे बंद कर देना चाहिए। मैं यह नहीं बता रहा हूं कि यह सभी मामलों में सबसे अच्छा अभ्यास है लेकिन ज्यादातर मामलों में इसका निश्चित रूप से व्यवहार्य विकल्प ...
मार्टिन 18uka

2
जब मैंने इसे झूठे के लिए सेट किया तो यह अभी भी मुझे वही त्रुटि देता है, क्या समस्या हो सकती है? मैं वीएस कोड का उपयोग कर रहा हूं
सेप्टेड

66

ऐसा इसलिए है क्योंकि टाइपस्क्रिप्ट 2.7 में एक सख्त वर्ग जांच शामिल है जहां सभी गुणों को कंस्ट्रक्टर में आरंभीकृत किया जाना चाहिए। वर्कअराउंड को !चर नाम के रूप में पोस्टफ़िक्स के रूप में जोड़ना है :

makes!: any[];

12
"!" उन सामान्य-ईश मामलों के लिए सिंटैक्स मौजूद है जहां आप गारंटी नहीं दे सकते कि मूल्य तुरंत परिभाषित किया जाएगा। यह पलायन हैच है, और इस पर भरोसा नहीं किया जाना चाहिए, क्योंकि यह आपके कोड को कम सुरक्षित बना सकता है। एक डिफ़ॉल्ट मान आमतौर पर पसंद किया जाता है। यह जानने के लिए अच्छा है कि यह मौजूद है,
kingdaro

@kingdaro सही है। हालांकि यह आम तौर पर इस्तेमाल किया जा सकता है, यह भी कोड के लिए नेतृत्व कर सकते हैं कि फ्लैट काम नहीं करता है। एक उदाहरण के रूप में, VS2017 द्वारा उत्पन्न मूल वेब में, ''! जोड़कर fetchdata.compords.ts में पूर्वानुमान के लिए असाइनमेंट बदलें। (सार्वजनिक पूर्वानुमान !: वेदरफ़ोरकास्ट [];) और यह पूरी तरह से त्रुटि का कारण
बनेगा

यह सबसे अच्छा समाधान है, क्योंकि यह सीधे @Input () डेकोरेटर (नए कोणीय) के बाद है, जब किसी भी घटक को पढ़ते हैं, तो यह स्वाभाविक रूप से पढ़ता है और किसी भी देव गलतियों को मिटा देता है।
ELI7VH

22

फ़ाइल 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 {
  // Ensure the input bindings are actually provided at run-time
  this.assertInputsProvided();
}

चर को परिभाषित करने के बाद, चर का उपयोग किया जा सकता है:

ngOnChanges() {
  this.userService.get(this.userId)
    .subscribe(user => {
      this.update(user.confirmedEmail);
    });
}

ध्यान दें कि ngOnInitइनपुट बाइंडिंग प्रयास के बाद विधि को कॉल किया जाता है, यह, भले ही बाइंडिंग को कोई वास्तविक इनपुट प्रदान नहीं किया गया हो।

जबकि ngOnChangesइनपुट बाइंडिंग के प्रयास के बाद विधि को कॉल किया जाता है, और केवल तभी बाइंडिंग के लिए वास्तविक इनपुट प्रदान किया जाता है।


'सख्त' मोड का उपयोग करते समय यह सही उत्तर है
RnDrx

8

यदि आप वास्तव में इसे प्रारंभ नहीं करना चाहते हैं तो आप निम्न कार्य भी कर सकते हैं।

makes?: any[];

8

आपको या तो --strictPropertyInitializationउस सिटिथरन को निष्क्रिय करने की आवश्यकता है , या प्रारंभिक आवश्यकता को पूरा करने के लिए ऐसा कुछ करना होगा:

makes: any[] = [];

6

टाइपस्क्रिप्ट 2.7.2 के रूप में, आपको कंस्ट्रक्टर में एक संपत्ति को इनिशियलाइज़ करना आवश्यक है यदि यह घोषणा के बिंदु पर असाइन नहीं किया गया है।

यदि आप Vue से आ रहे हैं, तो आप निम्नलिखित प्रयास कर सकते हैं:

  • "strictPropertyInitialization": trueअपने tsconfig.json में जोड़ें

  • यदि आप इसे अक्षम करने से नाखुश हैं तो आप भी यह कोशिश कर सकते हैं makes: any[] | undefined। ऐसा करने के लिए आवश्यक है कि आप रिक्त चेक ( ?.) ऑपरेटर अर्थात के साथ गुणों का उपयोग करेंthis.makes?.length

  • आप अच्छी तरह से कोशिश कर सकते हैं makes!: any[];, यह टीएस को बताता है कि मूल्य रनटाइम पर सौंपा जाएगा।

4

जब आप typecript@2.9.2 का उपयोग करके अपग्रेड करते हैं, तो इसका कंपाइलर कंपोनेंट क्लास कंस्ट्रक्टर के अंदर ऐरे टाइप डिक्लेयर के नियमों का सख्ती से पालन करता है।

इस समस्या को हल करने के लिए या तो कोड में घोषित किए गए कोड को बदल दें या संपत्ति को जोड़ने के लिए "सख्तPropertyInitialization" से बचने के लिए बचें : "tsconfig.json" फ़ाइल में झूठी और फिर से npm शुरू करें।

कोणीय वेब और मोबाइल एप्लिकेशन डेवलपमेंट आप www.jtechweb.in पर जा सकते हैं


3

क्या आप सिर्फ एक निश्चित असाइनमेंट का उपयोग नहीं कर सकते? ( Https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#definite-assignment-assertions देखें )

संपत्ति की घोषणा के रूप makes!: any[];में! टाइपस्क्रिप्ट का आश्वासन देता है कि निश्चित रूप से रनटाइम पर एक मूल्य होगा।

क्षमा करें, मैंने इसे कोणीय में आज़माया नहीं है लेकिन मेरे लिए यह बहुत अच्छा काम हुआ जब मुझे रिएक्ट में ठीक यही समस्या थी।


सभी संस्करणों के साथ काम करना क्योंकि यह आधिकारिक दस्तावेज में है और मैंने इसकी कोशिश की। धन्यवाद!!
हुसैन अकर

3

मेरे कोणीय प्रोजेक्ट में नोड जोड़ने के समय यह त्रुटि प्राप्त करें -

TSError:? टाइपस्क्रिप्ट संकलित करने में असमर्थ: (पथ) /base.api.ts:19:13 - त्रुटि TS2564: संपत्ति 'एपीरूट पथ' का कोई आरम्भक नहीं है और निश्चित रूप से निर्माणकर्ता को नहीं सौंपा गया है।

निजी एपीरूटपाथ: स्ट्रिंग;

उपाय -

Tsconfig.json के"strictPropertyInitialization": false 'संकलक' में जोड़ा गया ।

मेरा पैकेज। json -

"dependencies": {
    ...
    "@angular/common": "~10.1.3",
    "@types/express": "^4.17.9",
    "express": "^4.17.1",
    ...
}

Ref URL - https://www.ryadel.com/en/ts2564-ts-property-has-no-initializer-typescript-error-fix-visual-studio-2017-vs2017/


2

त्रुटि वैध है और आपके ऐप को क्रैश होने से रोक सकती है। आपने टाइप कियाmakes एक सरणी के रूप में किया, लेकिन यह अपरिभाषित भी हो सकता है।

आपके पास 2 विकल्प हैं (मौजूदा के लिए टाइपस्क्रिप्ट के कारण को अक्षम करने के बजाय ...):

1. आपके मामले में सबसे अच्छा यह है makesकि कब्जे वाले अपरिभाषित के रूप में लिखें ।

makes?: any[]
// or
makes: any[] | undefined

इस मामले में संकलक आपको सूचित करेगा कि जब भी आप makesउस तक पहुंचने की कोशिश करते हैं तो यह अपरिभाषित हो सकता है। छूट के लिए यदि आप समाप्त // <-- Not okहोने से पहले नीचे की पंक्तियों को लिखते हैं getMakesया getMakesविफल रहता है, तो संकलन त्रुटि डाली जाएगी। अन्यथा आपका एप्लिकेशन क्रैश हो जाएगा।

makes[0] // <-- Not ok
makes.map(...) // <-- Not ok

if (makes) makes[0] // <-- Ok
makes?.[0] // <-- Ok
(makes ?? []).map(...) // <-- Ok

2. आप मान सकते हैं कि यह कभी भी विफल नहीं होगा और आप इसे कोड लिखने से पहले कभी भी इसे एक्सेस करने का प्रयास नहीं करेंगे। इसलिए कंपाइलर इसका ध्यान नहीं रखेगा।

makes!: any[]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.