সম্পত্তি '…' এর কোনও আরম্ভকারী নেই এবং অবশ্যই এটি কনস্ট্রাক্টারে নির্ধারিত নয়


103

আমার কৌণিক অ্যাপে আমার একটি উপাদান রয়েছে:

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);
  }
}

তবে "মেকস" সম্পত্তিতে আমার একটি ভুল আছে। আমি কী করব তা জানি না ...

ভুল

উত্তর:


59

আমি মনে করি আপনি টাইপস্ক্রিপ্টের সর্বশেষতম সংস্করণটি ব্যবহার করছেন। দয়া করে এর "কঠোর শ্রেণি সূচনা" বিভাগটি দেখুন link

এটি ঠিক করার দুটি উপায় রয়েছে:

উ: আপনি যদি ভিএসকোড ব্যবহার করে থাকেন তবে আপনাকে যে টিএস সংস্করণটি ব্যবহার করে তা পরিবর্তন করতে হবে।

বি। আপনি কন্সট্রাক্টরের ভিতরে ঘোষণা করার সাথে সাথে অ্যারে শুরু করুন,

makes: any[] = [];

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

দুঃখিত, আমি টাইপ স্ক্রিপ্টে নতুন। আপনি বলতে পারেন আমার ভুল কোথায়?
মাইকেল কোস্টিওচেঙ্কো

4
ত্রুটিটি যেমন বলে যে আপনার কিছু পরিবর্তনযোগ্যকে ভেরিয়েবলটি শুরু করতে হবে: যে কোনও [] = [];
সজীবথরন

156

কেবল tsconfig.json এ গিয়ে সেট করুন

"strictPropertyInitialization": false

সংকলন ত্রুটি থেকে মুক্তি পেতে।

অন্যথায় আপনাকে আপনার সমস্ত পরিবর্তনশীল সূচনা করতে হবে যা কিছুটা বিরক্তিকর


4
"কড়া" হওয়ার পরে আপনি এটি যুক্ত করেছেন তা নিশ্চিত করুন: অন্যথায় ট্রান্সপোর্টারটি আবার এটি চালু করে বলে মনে হচ্ছে (যদিও ভিএস মনে হয় এটি বন্ধ রয়েছে)।
মন্টি

35
এইভাবে আপনি সমস্ত প্রকল্পের জন্য কঠোর চেকিং সম্পত্তি সূচনা অক্ষম করবেন। !ভেরিয়েবল নামেরটিতে পোস্টফিক্স অপারেটর যুক্ত করা ভাল, কেবল এই কেসটিকে উপেক্ষা করার জন্য, বা কনস্ট্রাক্টরের ভিতরে ভেরিয়েবলটি আরম্ভ করার জন্য।
মাত্তেও গারনারিও

6
সংকলক যে সম্ভাব্য সমস্যাগুলি বলছে তা উপেক্ষা করার পরামর্শ দিচ্ছেন, এটি সত্যই নিরাপদ নয়। তাই ডাউনভোট।
ওলগা

6
স্ট্রাইকপ্রোপার্টিআইনিটিয়ালজার হ'ল টাইপ স্ক্রিপ্ট ২.7 এ প্রবর্তিত একটি পতাকা। আপনি যদি এই সমস্ত পতাকা সক্ষম করতে চান এবং কঠোরভাবে সমস্ত নিয়ম অনুসরণ করতে চান বা কিছু বৈধতা বন্ধ করতে চান তা প্রত্যেকেরই পছন্দ। এটি প্রতিবার সমস্ত নিয়ম মেনে চলা সম্পূর্ণ বুদ্ধিমান নয়। যদি আপনার কোডটি খুব ভার্জোজ এবং ডাউনসাইড হয় এবং সুবিধার চেয়ে বড় হয় তবে আপনাকে অবশ্যই এটি বন্ধ করে দেওয়া উচিত। আমি বলছি না যে এটি সব ক্ষেত্রেই সর্বোত্তম অনুশীলন তবে বেশিরভাগ ক্ষেত্রেই এটির চূড়ান্ত কার্যকর বিকল্প ...
মার্টিন Čাকা

4
আমি আমার উত্তরে যেমন উল্লেখ করেছি আপনার কাছে দুটি বিকল্প রয়েছে আপনি হয় বৈধতা অক্ষম করুন বা সমস্ত পরিবর্তনশীল সূচনা করুন। প্রকল্প থেকে প্রকল্পে আপনি কী আরও বেশি উপকৃত হবেন তা চয়ন করা প্রত্যেকের কাজ।
মার্টিন Čuka

46

এটি কারণ টাইপস্ক্রিপ্ট 2.7 একটি কঠোর শ্রেণীর চেকিং অন্তর্ভুক্ত যেখানে সমস্ত সম্পত্তি নির্মাণকারীর মধ্যে আরম্ভ করা উচিত। !ভেরিয়েবল নামেরটিতে পোস্টফিক্স হিসাবে যুক্ত করার জন্য একটি কর্মসংস্থান:

makes!: any[];

11
দ্য "!" সিনট্যাক্স সেইসব সাধারণ-ইশ ক্ষেত্রে রয়েছে যেখানে আপনি গ্যারান্টি দিতে পারবেন না যে মানটি তাত্ক্ষণিক সংজ্ঞায়িত হবে। এটি একটি পালানোর হ্যাচ, এবং এর উপর নির্ভর করা উচিত নয় কারণ এটি আপনার কোডটি কম সুরক্ষিত করতে পারে। একটি ডিফল্ট মান সাধারণত পছন্দ করা হয়। এটি বিদ্যমান তা জেনে রাখা ভাল, যদিও
কিংডোরাদো

@kingdaro ঠিক আছে এটি সাধারণত ব্যবহার করা যেতে পারে, এটি এমন কোডের দিকেও নিয়ে যেতে পারে যে ফ্ল্যাট কাজ করে না। উদাহরণস্বরূপ, ভিএস2017 দ্বারা উত্পন্ন বেসিক ওয়েব অ্যাপ্লিকেশনগুলিতে, 'যোগ করুন! (সর্বজনীন পূর্বাভাস !: WeatherForecast [];) এবং এটা কারণ সম্পূর্ণভাবে ত্রুটি করবে
IronRod

14

ফাইলটিতে 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;

ভেরিয়েবলটি beচ্ছিক হতে পারে উল্লেখ করে আমরা সংকলকটি নিরব করতে পারি:

@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ইনপুট বাইন্ডিং চেষ্টার পরে পদ্ধতি বলা হয়, এবং কেবল যদি সেখানে প্রকৃত বাইন্ডিং প্রদান করা ইনপুট ছিল।


'কঠোর' মোডটি ব্যবহার করার সময় এটি সঠিক উত্তর
17 নভেম্বর 2:42

8

হয় হয় আপনাকে --strictPropertyInitializationসজীবথরন উল্লেখ করা অক্ষম করতে হবে, বা প্রারম্ভিককরণের প্রয়োজনীয়তা পূরণের জন্য এই জাতীয় কিছু করতে হবে:

makes: any[] = [];

5

আপনি যদি সত্যিই এটি আরম্ভ করতে না চান তবে আপনি নিম্নলিখিতগুলিও করতে পারেন।

makes?: any[];

4

আপনি টাইপ স্ক্রিপ্ট @ ২.৯.২ ব্যবহার করে আপগ্রেড করার সময় এর সংকলক কঠোর নিয়মগুলি অনুসরণ করে অ্যারে প্রকারের জন্য উপাদান শ্রেণীর কনস্ট্রাক্টরের ভিতরে ঘোষণা করুন declare

ফিক্স জন্য এই সমস্যা হয় কোড যেখানে কম্পাইলার কোড বা এড়ানোর ঘোষণা করা হয় সম্পত্তি যোগ করার জন্য পরিবর্তন মিথ্যা: "strictPropertyInitialization" মধ্যে "tsconfig.json" ফাইল শুরু npm আবার চালানো।

কৌণিক ওয়েব এবং মোবাইল অ্যাপ্লিকেশন বিকাশ আপনি www.jtechweb.in যেতে পারেন


4

টাইপসক্রিপ্ট ২..2.২ অনুসারে, আপনাকে কনস্ট্রাক্টরের কোনও সম্পত্তি শুরু করার প্রয়োজন যদি এটি ঘোষণার স্থানে বরাদ্দ না দেওয়া হয়।

যদি আপনি ভ্যু থেকে আগত হন তবে আপনি নিম্নলিখিতগুলি চেষ্টা করতে পারেন:

  • যোগ "strictPropertyInitialization": trueআপনার tsconfig.json করতে

  • আপনি যদি এটি অক্ষম করে অসন্তুষ্ট হন তবে আপনি এটি চেষ্টা করে দেখতেও পারেন makes: any[] | undefined। এটি করার জন্য আপনাকে নাল চেক ( ?.) অপারেটর সহ বৈশিষ্ট্যগুলি অ্যাক্সেস করতে হবেthis.makes?.length

  • আপনি পাশাপাশি চেষ্টা করতে পারেন makes!: any[];, এটি টিএসকে বলে যে মান রানটাইমে নির্ধারিত হবে।

2

আপনি কি কেবলমাত্র একটি ডেফিনেট অ্যাসাইনমেন্ট এ্যাসারেন্স ব্যবহার করতে পারবেন না? ( Https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#definite-assignment-assertions দেখুন )

অর্থ সম্পত্তি হিসাবে ঘোষণা makes!: any[];! টাইপস্ক্রিপ্টকে আশ্বাস দেয় যে রানটাইমের সময় অবশ্যই একটি মান থাকবে।

দুঃখিত, আমি কৌণিকভাবে এটি চেষ্টা করে দেখিনি তবে যখন আমি প্রতিক্রিয়াতে ঠিক একই সমস্যা হচ্ছিলাম তখন এটি আমার পক্ষে দুর্দান্ত কাজ করেছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.