আমি কীভাবে অবজেক্টগুলির অ্যারে সংজ্ঞা দিতে পারি?


198

আমি টাইপস্ক্রিপ্টে বস্তুর একটি অ্যারে তৈরি করছি:

 userTestStatus xxxx = {
    "0": { "id": 0, "name": "Available" },
    "1": { "id": 1, "name": "Ready" },
    "2": { "id": 2, "name": "Started" }
 };

কেউ আমাকে বলতে পারেন যে আমি কীভাবে এর ধরণটি সঠিকভাবে ঘোষণা করতে পারি? ইনলাইন করা কি সম্ভব বা আমার দুটি সংজ্ঞা দরকার?

আমি xxxটাইপ ঘোষণার সাথে প্রতিস্থাপনের দিকে লক্ষ্য করছি , যাতে পরে যদি টাইপস্ক্রিপ্টে userTestStatus[3].nammmeভুল করে আমি এমন কিছু ব্যবহার করি তবে আমাকে সতর্ক করতে হবে ।

উত্তর:


279

সংখ্যার মতো বৈশিষ্ট্যযুক্ত কোনও অবজেক্টের পরিবর্তে একটি নেটিভ অ্যারে ব্যবহার করা ভাল , যাতে সংখ্যায়ন (পাশাপাশি আরও অনেক অ্যারে ফাংশন) অফ-শেল্ফের যত্ন নেওয়া হয়।

আপনি এখানে যা খুঁজছেন তা হ'ল আপনার অ্যারের জন্য একটি ইনলাইন ইন্টারফেস সংজ্ঞা যা সেই অ্যারের প্রতিটি উপাদানকে সংজ্ঞায়িত করে, প্রাথমিকভাবে উপস্থিত বা পরে প্রবর্তিত হোক:

let userTestStatus: { id: number, name: string }[] = [
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

যদি আপনি এখনই মানগুলি দিয়ে আপনার অ্যারে শুরু করছেন তবে সুস্পষ্ট ধরণের সংজ্ঞাটি প্রয়োজনীয়তা নয়; প্রারম্ভিক অ্যাসাইনমেন্ট থেকে টাইপসক্রিপ্ট স্বয়ংক্রিয়ভাবে বেশিরভাগ উপাদান ধরণেরগুলি নির্ধারণ করতে পারে:

let userTestStatus = [
    { "id": 0, "name": "Available" },
    ...
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

4
এছাড়াও আপনি এইভাবে অবজেক্টগুলির একটি অ্যারে ঘোষণা করতে পারেন:let someArray: Array<{ id: number, name: string }> = []
— আলেকজান্ডার কিম

75

আপনার উপরে যা আছে তা হ'ল একটি বস্তু, অ্যারে নয়।

একটি অ্যারের ব্যবহার করতে [এবং ]আপনার অবজেক্টগুলিকে ঘিরে।

userTestStatus = [
  { "id": 0, "name": "Available" },
  { "id": 1, "name": "Ready" },
  { "id": 2, "name": "Started" }
];

এ ছাড়াও টাইপস্ক্রিপ্টটি জাভাস্ক্রিপ্টের সুপারসেট তাই যা যা জাভাস্ক্রিপ্ট বৈধ তা টাইপস্ক্রিপ্ট তাই অন্য কোনও পরিবর্তন দরকার নেই।

ওপি থেকে প্রতিক্রিয়ার স্পষ্টতা ... পোস্ট করা মডেলের জন্য একটি সংজ্ঞা প্রয়োজন

আপনি নিজের অবজেক্টের মডেলটি উপস্থাপন করতে এখানে সংজ্ঞায়িত প্রকারগুলি ব্যবহার করতে পারেন:

type MyType = {
    id: number;
    name: string;
}

type MyGroupType = {
    [key:string]: MyType;
}

var obj: MyGroupType = {
    "0": { "id": 0, "name": "Available" },
    "1": { "id": 1, "name": "Ready" },
    "2": { "id": 2, "name": "Started" }
};
// or if you make it an array
var arr: MyType[] = [
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
];

দুঃখিত, আমার প্রশ্নটি পরিষ্কার ছিল না। আমি যা করতে চেয়েছিলাম তা ছিল ইউজার টেস্টস্টাসের সংজ্ঞা পাওয়া।

1
@ মারিলো আপনি সাধারণত userTestStatusআপনার পছন্দের আইডিইতে পরিবর্তনশীলকে ঘুরিয়ে দিয়ে সংজ্ঞাটি পেতে পারেন ... টাইপস্ক্রিপ্ট খেলার মাঠের শোতে { id: number, name: string; }[]। আপনি যদি কোনও ইন্টারফেসে মোড়ানো করতে পারেন তবে আপনি পছন্দ করতে পারেন interface NameThis { id: number, name: string; }এবং NameThis[]অ্যারের ধরণ হিসাবে।
— ফেন্টন

আমি এটি চেষ্টা করেছিলাম তবে এটি আমাকে কয়েকটি ত্রুটি দেয়। তবে আমি এটি আমার চাই এমন কিছু বলে মনে করি: ইউজারটেষ্টস্ট্যাটাস: {আইডি: নম্বর, নাম: স্ট্রিং; } [] = {"0": {"আইডি": 0, "নাম": "উপলব্ধ"}, "1": id "আইডি": 1, "নাম": "প্রস্তুত"

আপনার উদাহরণ সংজ্ঞায়িত করে var arr: MyType, আপনি যেমন সম্পত্তি নাম / সূচক ঘোষণা হিসাবে ব্যবহার করবেন না "0": { … }; আপনি এই মুহূর্তে অবজেক্টটি আক্ষরিক ব্যবহার করবেন।
— গুলফ্লাম

@ গফুল্লাম আপনি সঠিক, আমি আমার উত্তর আপডেট করেছি (এটি একটি দ্রুত নির্লিপ্ত সম্পাদনা ছিল)
— ব্রোকো

34

কিছু tslintনিয়ম [] উদাহরণ বার্তা ব্যবহার নিষ্ক্রিয় করছে:Array type using 'T[]' is forbidden for non-simple types. Use 'Array<T>' instead.

তাহলে আপনি এটি লিখতে হবে:

var userTestStatus: Array<{ id: number, name: string }> = Array(
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
);

2
সর্বাধিক বাস্তববাদী পদ্ধতির। এটি সহজ অ্যারে ব্যবহারের ক্ষেত্রে সহজ এবং সরাসরি সমাধান solution আমার +1 নিন
— জুলিও বেদোভাত্তো

16

আপনি যা চান তা কেবল একটি গণনা হতে পারে

যদি আপনি এমন কোনও কিছু সন্ধান করছেন যা একটি গণনার মতো আচরণ করে (কারণ আমি দেখতে পাচ্ছি যে আপনি কোনও বস্তুর সংজ্ঞা দিচ্ছেন এবং অনুক্রমিক আইডি 0, 1, 2 সংযুক্ত করছেন এবং এমন একটি নাম ক্ষেত্র রয়েছে যা আপনি ভুল বানান করতে চান না (যেমন নাম বনাম নাম)) , আপনি একটি অঙ্ককে সংজ্ঞায়িত করার চেয়ে আরও ভাল কারণ সিক্যুয়াল আইডিটি স্বয়ংক্রিয়ভাবে যত্ন নেওয়া হয় এবং আপনার বাক্সের বাইরে টাইপ ভেরিফিকেশন সরবরাহ করে।

enum TestStatus {
    Available,     // 0
    Ready,         // 1
    Started,       // 2
}

class Test {
    status: TestStatus
}

var test = new Test();
test.status = TestStatus.Available; // type and spelling is checked for you,
                                    // and the sequence ID is automatic

উপরের মানগুলি স্বয়ংক্রিয়ভাবে ম্যাপ করা হবে, যেমন "উপলভ্য" এর জন্য "0" এবং আপনি এগুলি ব্যবহার করে অ্যাক্সেস করতে পারেন TestStatus.Available। এবং যখন টাইপস্ক্রিপ্ট আপনি চারপাশে পাস করেন তখন প্রকারটি কার্যকর করে।

আপনি যদি নিজের কাস্টম ধরণের অ্যারে হিসাবে কোনও নতুন প্রকারকে সংজ্ঞায়িত করার জন্য জেদ করেন

আপনি অবজেক্টগুলির একটি অ্যারে চেয়েছিলেন , (কীগুলি "0", "1" এবং "2" এর সাথে হুবহু নয়), সুতরাং প্রথমে অবজেক্টের ধরণটি সংজ্ঞায়িত করা যাক, তারপরে একটি ধরণের অ্যারেযুক্ত এক ধরণের সংজ্ঞা দিন।

class TestStatus {
    id: number
    name: string

    constructor(id, name){
        this.id = id;
        this.name = name;
    }
}

type Statuses = Array<TestStatus>;

var statuses: Statuses = [
    new TestStatus(0, "Available"),
    new TestStatus(1, "Ready"),
    new TestStatus(2, "Started")
]

দুঃখিত, আমার প্রশ্নটি পরিষ্কার ছিল না। আমি যা করতে চেয়েছিলাম তা ছিল ইউজার টেস্টস্ট্যাটাসের জন্য একটি সংজ্ঞা খুঁজে বার করা যাতে টাইপস্ক্রিপ্টটি আমাকে এটি কোথায় ব্যবহৃত হয়েছে তা পরীক্ষা করার অনুমতি দেয় এবং উদাহরণস্বরূপ আমি ইউজার টেস্টস্টাস [১] .aaaame প্রবেশ করতে পারিনি।

আমি "ইউজার টেস্টস্ট্যাটাস" এবং "=" এর মধ্যে কিছু রাখতে চাইছিলাম। একইভাবে যে আমি সেখানে স্ট্রিং বা সংখ্যাটি লিখতে চাই যা ভেরিয়েবলের টাইপ রয়েছে তা বলতে। ব্রোকো এর মতো কিছু সবেমাত্র করেছে তবে এটি সম্ভব হলে কেবল একটি লাইন দিয়ে।

-1

আপনি চেষ্টা করতে পারেন

    interface IData{
        id: number;
        name:string;
    }

    let userTestStatus:Record<string,IData> = {
        "0": { "id": 0, "name": "Available" },
        "1": { "id": 1, "name": "Ready" },
        "2": { "id": 2, "name": "Started" }
    };

রেকর্ডটি কীভাবে কাজ করে তা পরীক্ষা করতে: https://www.typescriptlang.org/docs/handbook/u टिल-types.html# recordkt

এখানে আমাদের ক্ষেত্রে রেকর্ডটি এমন কোনও অবজেক্টকে ডিক্লেয়ার করতে ব্যবহৃত হয় যার কী কী স্ট্রিং হবে এবং যার মান আইডাটা টাইপ হবে তাই এখন এটি আমাদের ইন্টেলিজেন্স প্রদান করবে যখন আমরা এর সম্পত্তিটি অ্যাক্সেস করার চেষ্টা করব এবং প্রকারের চেষ্টা করার ক্ষেত্রে টাইপ ত্রুটি নিক্ষেপ করবে ইউজারস্টেস্ট্যাটাসের মতো কিছু [0] .নামি


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