একটি টাইপড ভেরিয়েবলের জন্য টাইপস্ক্রিপ্ট খালি বস্তু


88

বলুন আমার আছে:

type User = {
...
}

আমি একটি নতুন তৈরি করতে চাই userতবে এটিকে একটি খালি বস্তু হিসাবে সেট করতে চাই :

const user: User = {}; // This fails saying property XX is missing
const user: User = {} as any; // This works but I don't want to use any

আমি এটা কিভাবে করবো? আমি পরিবর্তনশীল হতে চাই না null


15
হয় আপনি userটাইপ হতে চান User | {}বা Partial<User>, বা Userখালি অবজেক্টের অনুমতি দেওয়ার জন্য আপনার টাইপটির নতুন সংজ্ঞা দেওয়া দরকার । ঠিক এখন, কম্পাইলার সঠিকভাবে আপনি কহন যে userএকটি নয় User
jcalz

উত্তর:


186

গুহা

মন্তব্যগুলি থেকে এখানে দুটি যোগ্য সতর্কতা রয়েছে।

হয় আপনি ব্যবহারকারী টাইপ হতে চান User | {}বা Partial<User>, বা Userখালি অবজেক্টের অনুমতি দেওয়ার জন্য আপনার টাইপটির নতুন সংজ্ঞা দেওয়া দরকার । এখনই, সংকলকটি আপনাকে সঠিকভাবে বলছে যে ব্যবহারকারী কোনও ব্যবহারকারী নয়। -jcalz

আমার মনে হয় না এটিকে একটি যথাযথ উত্তর হিসাবে বিবেচনা করা উচিত কারণ এটি টাইপস্ক্রিপ্টের পুরো উদ্দেশ্যকে ক্ষুন্ন করে টাইপের একটি অসামঞ্জস্যপূর্ণ উদাহরণ তৈরি করে। এই উদাহরণে, সম্পত্তিটি Usernameঅপরিশোধিত রেখে দেওয়া হয়েছে, প্রকারের টিকাটি বলছে এটি এটিকে সংজ্ঞায়িত করা যায় না। -Ian Liu Rodrigues

উত্তর

এক টাইপ করা বিষয় নকশা গোল হয় "শুদ্ধি ও উত্পাদনশীলতা মধ্যে একটি ভারসাম্য বজায় রাখতে ধরা।" এটি করার জন্য যদি এটি আপনার পক্ষে ফলপ্রসূ হয় তবে টাইপড ভেরিয়েবলের জন্য খালি অবজেক্ট তৈরি করতে টাইপ এ্যাসারেন্স ব্যবহার করুন

type User = {
    Username: string;
    Email: string;
}

const user01 = {} as User;
const user02 = <User>{};

user01.Email = "foo@bar.com";

আপনার জন্য একটি কার্যকারী উদাহরণ এখানে ।

প্রস্তাবের সাথে কাজ করার জন্য এখানে ক্লিক করা হচ্ছে।


9
ধন্যবাদ! এটি সমাধান করে! এটি সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত ...
কোকোডোকো

4
আমার মনে হয় না এটিকে একটি যথাযথ উত্তর হিসাবে বিবেচনা করা উচিত কারণ এটি টাইপস্ক্রিপ্টের পুরো উদ্দেশ্যকে ক্ষুন্ন করে টাইপের একটি অসামঞ্জস্যপূর্ণ উদাহরণ তৈরি করে। এই উদাহরণে, সম্পত্তিটি Usernameঅপরিশোধিত রেখে দেওয়া হয়েছে, প্রকারের টিকাটি বলছে এটি এটিকে সংজ্ঞায়িত করা যায় না।
ইয়ান লিউ রডরিগস

4
ভাল আইডেন্ট @ ইয়ানলিউরডরিগস। আমি উত্তরে কিছু সতর্কতা যুক্ত করেছি।
শন লুটিন

4
@ আইয়ানলিউরডরিগেস টাইপসক্রিপ্টের অন্যতম লক্ষ্য হ'ল উত্পাদনশীলতার সাথে নির্ভুলতার ভারসাম্য বজায় রাখা, তাই বলা যায় যে এটি টাইপস্ক্রিপ্টের পুরো উদ্দেশ্যটিকে কিছুটা চরম করে তোলেgithub.com/Mic Microsoft
শন লুটিন

22

সত্যিই আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে। প্রকারগুলি টাইপস্ক্রিপ্টে ডকুমেন্টেশন হয়, সুতরাং আপনি টাইপ তৈরি করার সময় এই জিনিসটি কীভাবে ব্যবহৃত হবে বলে ধারণা করাতে চান show

বিকল্প 1: ব্যবহারকারীদের জীবদ্দশায় কিছু তবে তবে সমস্ত বৈশিষ্ট্য না থাকলে থাকতে পারে

সমস্ত বৈশিষ্ট্য alচ্ছিক করুন

type User = {
  attr0?: number
  attr1?: string
}

বিকল্প 2: ব্যবহারকারীগুলি সহ ভেরিয়েবলগুলি যদি শূন্য হতে শুরু করে

type User = {
...
}
let u1: User = null;

যদিও, সত্যিই, এখানে যদি বিষয়টি ব্যবহারকারী অবজেক্টটিকে এটি নির্ধারিত করা হবে তা আগে জানা যায় তবে আপনি সম্ভবত let u1:Userকোনও অ্যাসাইনমেন্ট ছাড়াই করতে চান ।

বিকল্প 3: আপনি সম্ভবত কি চান

সত্যই, টাইপস্ক্রিপ্টের ভিত্তিটি নিশ্চিত করা যে আপনি যে মানসিক মডেলটির সাথে সামঞ্জস্য করছেন সেগুলি ভুলগুলি এড়ানোর জন্য আপনি বিভিন্ন ধরণের রূপরেখা তৈরি করছেন। আপনি যদি কোনও বস্তুর কাছে একের পর এক জিনিস যুক্ত করতে চান তবে এটি এমন একটি অভ্যাস যা টাইপস্ক্রিপ্ট আপনাকে না করার চেষ্টা করছে।

আরও সম্ভবত, আপনি কিছু স্থানীয় ভেরিয়েবল তৈরি করতে চান, তারপরে একটি পূর্ণ-অন ব্যবহারকারী হওয়ার জন্য প্রস্তুত হয়ে ব্যবহারকারী-যুক্ত ভেরিয়েবলকে বরাদ্দ করুন। এইভাবে আপনি কোনও আংশিক-গঠনযুক্ত ব্যবহারকারীর সাথে কখনও ছাড়বেন না। Things জিনিসগুলি স্থূল।

let attr1: number = ...
let attr2: string = ...
let user1: User = {
  attr1: attr1,
  attr2: attr2
}

তিনি এটি যাচ্ছেন বা না তা নিশ্চিত কিনা তা নিশ্চিত নয়, তবে এটি সম্ভবত আমরা ইউজারঅ্যাট্রিবিউটস বা একটি আগত প্যারামিটারগুলি পরিচালনা করে এমন একটি পৃথক যুক্তির কথা বলছি। এটি কোনও গ্রহণযোগ্য ব্যবহারকারীর অবজেক্ট নাও হতে পারে এবং তাই এটি আলাদাভাবে সংজ্ঞায়িত করা যেতে পারে।
ফুল দেয়

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়। নীচে শন লুটিনের পোস্টটি দেখুন।
থার্ডেনডিয়াড

2

আপনি টাইপ স্ক্রিপ্ট নীচে হিসাবে এটি করতে পারেন

 const _params = {} as any;

 _params.name ='nazeh abel'

যেহেতু টাইপস্রিপ্ট জাভাস্ক্রিপ্টের মতো আচরণ করে না তাই আমাদের টাইপটিকে অন্য হিসাবে তৈরি করতে হবে অন্যথায় এটি আপনাকে কোনও বস্তুকে গতিশীলভাবে সম্পত্তি বরাদ্দ করতে দেয় না won't


2

নোট করুন যে const user = {} as UserTypeব্যবহারটি কেবল ইন্টেলিজেন্স সরবরাহ করে তবে রানটাইম userখালি অবজেক্ট {}এবং এর ভিতরে কোনও সম্পত্তি নেই। এর পরিবর্তে user.Emailদেবে মানেundefined""

type UserType = {
    Username: string;
    Email: string;
}

সুতরাং, ব্যবহার classসঙ্গে constructorআসলে ডিফল্ট properties সহযোগে বস্তু তৈরি করার জন্য।

type UserType = {
  Username: string;
  Email: string;
};

class User implements UserType {
  constructor() {
    this.Username = "";
    this.Email = "";
  }

  Username: string;
  Email: string;
}

const myUser = new User();
console.log(myUser); // output: {Username: "", Email: ""}
console.log("val: "+myUser.Email); // output: ""

আপনি interfaceপরিবর্তে ব্যবহার করতে পারেনtype

interface UserType {
  Username: string;
  Email: string;
};

... এবং কোডের বাকী অংশ একই রয়েছে।


আসলে, আপনি এমনকি constructorঅংশটি এড়িয়ে যেতে এবং এটি ব্যবহার করতে পারেন:

class User implements UserType {
      Username = ""; // will be added to new obj
      Email: string; // will not be added
}

const myUser = new User();
console.log(myUser); // output: {Username: ""}

1

যদি আপনি একটি খালি বস্তুকে আক্ষরিক ঘোষণা করেন এবং পরে মানগুলি নির্ধারণ করেন তবে আপনি সেই মানগুলি alচ্ছিক বিবেচনা করতে পারেন (থাকতে পারে বা নাও থাকতে পারে), সুতরাং কেবল প্রশ্ন চিহ্ন সহ এগুলি optionচ্ছিক হিসাবে টাইপ করুন:

type User = {
    Username?: string;
    Email?: string;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.