উত্তর:
সম্পাদনা করুন : এটি সর্বশেষতম টিএস সংস্করণে স্থির করা হয়েছে। ওপি'র পোস্টে @ সাইমন_উইভারের মন্তব্যটি উদ্ধৃত করে:
দ্রষ্টব্য: এটি এর পরে ঠিক করা হয়েছে (কোনটি সঠিক টিএস সংস্করণ তা নিশ্চিত নয়)। আপনি যেমন আশা করবেন তেমন আমি এই ত্রুটিগুলি ভিএস এ পেয়েছি
Index signatures are incompatible. Type '{ firstName: string; }' is not assignable to type 'IPerson'. Property 'lastName' is missing in type '{ firstName: string; }'.
আপনি উদাহরণস্বরূপ ঘোষণা এবং প্রারম্ভিককরণে উদাহরণস্বরূপ ভাগ করে টাইপ করা অভিধানটি ব্যবহার করতে পারেন:
var persons: { [id: string] : IPerson; } = {};
persons["p1"] = { firstName: "F1", lastName: "L1" };
persons["p2"] = { firstName: "F2" }; // will result in an error
id
প্রতীকটির দরকার কী? মনে হয় এটি অপ্রয়োজনীয়।
id
প্রতীকটি ব্যবহার করে আপনি ঘোষণা করতে পারবেন অভিধানের কীগুলির প্রকারটি কী হওয়া উচিত। উপরোক্ত ঘোষণার সাথে, আপনি নিম্নলিখিতগুলি করতে পারবেন না:persons[1] = { firstName: 'F1', lastName: 'L1' }
id
প্রতীক মত কিছু নামে করা যাবে এবং সহজে কোড পাঠযোগ্য করতে যে ভাবে পরিকল্পনা করা হয়েছিল। উদাহরণস্বরূপ { [username: string] : IPerson; }
টাইপস্ক্রিপ্টে অভিধান অবজেক্ট ব্যবহার করার জন্য আপনি নীচের মত ইন্টারফেস ব্যবহার করতে পারেন:
interface Dictionary<T> {
[Key: string]: T;
}
এবং, এটি আপনার শ্রেণীর সম্পত্তি ধরণের জন্য ব্যবহার করুন।
export class SearchParameters {
SearchFor: Dictionary<string> = {};
}
এই ক্লাসটি ব্যবহার এবং আরম্ভ করার জন্য,
getUsers(): Observable<any> {
var searchParams = new SearchParameters();
searchParams.SearchFor['userId'] = '1';
searchParams.SearchFor['userName'] = 'xyz';
return this.http.post(searchParams, 'users/search')
.map(res => {
return res;
})
.catch(this.handleError.bind(this));
}
আমি থোমাক্সের সাথে একমত যে ইনিশিয়ালাইজেশন টাইপ চেকিং ত্রুটি একটি টাইপস্ক্রিপ্ট বাগ। তবে, আমি এখনও সঠিক টাইপ চেকিং সহ একক বিবৃতিতে ডিকশনারি ডিক্লেয়ার এবং আরম্ভ করার উপায় খুঁজে পেতে চেয়েছিলাম। এই প্রয়োগটি দীর্ঘতর, তবে এটি containsKey(key: string)
এবং remove(key: string)
পদ্ধতি হিসাবে অতিরিক্ত কার্যকারিতা যুক্ত করে । আমার সন্দেহ হয় যে একবার জেনেরিকগুলি 0.9 রিলিজ পাওয়া গেলে এটি সরল করা যেতে পারে।
প্রথমে আমরা বেস অভিধান ক্লাস এবং ইন্টারফেস ঘোষণা করি। সূচকটির জন্য ইন্টারফেসটি প্রয়োজনীয় কারণ শ্রেণিগুলি সেগুলি প্রয়োগ করতে পারে না।
interface IDictionary {
add(key: string, value: any): void;
remove(key: string): void;
containsKey(key: string): bool;
keys(): string[];
values(): any[];
}
class Dictionary {
_keys: string[] = new string[];
_values: any[] = new any[];
constructor(init: { key: string; value: any; }[]) {
for (var x = 0; x < init.length; x++) {
this[init[x].key] = init[x].value;
this._keys.push(init[x].key);
this._values.push(init[x].value);
}
}
add(key: string, value: any) {
this[key] = value;
this._keys.push(key);
this._values.push(value);
}
remove(key: string) {
var index = this._keys.indexOf(key, 0);
this._keys.splice(index, 1);
this._values.splice(index, 1);
delete this[key];
}
keys(): string[] {
return this._keys;
}
values(): any[] {
return this._values;
}
containsKey(key: string) {
if (typeof this[key] === "undefined") {
return false;
}
return true;
}
toLookup(): IDictionary {
return this;
}
}
এখন আমরা ব্যক্তি নির্দিষ্ট ধরণের এবং অভিধান / অভিধান ইন্টারফেস ঘোষণা করি। আমরা কীভাবে ওভাররাইড করে values()
এবং toLookup()
সঠিক প্রকারগুলি ফিরিয়ে আনতে পার্সনডেটের অভিধানে নোট করুন ।
interface IPerson {
firstName: string;
lastName: string;
}
interface IPersonDictionary extends IDictionary {
[index: string]: IPerson;
values(): IPerson[];
}
class PersonDictionary extends Dictionary {
constructor(init: { key: string; value: IPerson; }[]) {
super(init);
}
values(): IPerson[]{
return this._values;
}
toLookup(): IPersonDictionary {
return this;
}
}
এবং এখানে একটি সাধারণ সূচনা এবং ব্যবহারের উদাহরণ:
var persons = new PersonDictionary([
{ key: "p1", value: { firstName: "F1", lastName: "L2" } },
{ key: "p2", value: { firstName: "F2", lastName: "L2" } },
{ key: "p3", value: { firstName: "F3", lastName: "L3" } }
]).toLookup();
alert(persons["p1"].firstName + " " + persons["p1"].lastName);
// alert: F1 L2
persons.remove("p2");
if (!persons.containsKey("p2")) {
alert("Key no longer exists");
// alert: Key no longer exists
}
alert(persons.keys().join(", "));
// alert: p1, p3
containsKey(key: string): bool;
দিয়ে কাজ করে না । এটি পরিবর্তন করা উচিত । containsKey(key: string): boolean;
এখানে @dmck থেকে অনুপ্রাণিত আরও সাধারণ অভিধান প্রয়োগ রয়েছে
interface IDictionary<T> {
add(key: string, value: T): void;
remove(key: string): void;
containsKey(key: string): boolean;
keys(): string[];
values(): T[];
}
class Dictionary<T> implements IDictionary<T> {
_keys: string[] = [];
_values: T[] = [];
constructor(init?: { key: string; value: T; }[]) {
if (init) {
for (var x = 0; x < init.length; x++) {
this[init[x].key] = init[x].value;
this._keys.push(init[x].key);
this._values.push(init[x].value);
}
}
}
add(key: string, value: T) {
this[key] = value;
this._keys.push(key);
this._values.push(value);
}
remove(key: string) {
var index = this._keys.indexOf(key, 0);
this._keys.splice(index, 1);
this._values.splice(index, 1);
delete this[key];
}
keys(): string[] {
return this._keys;
}
values(): T[] {
return this._values;
}
containsKey(key: string) {
if (typeof this[key] === "undefined") {
return false;
}
return true;
}
toLookup(): IDictionary<T> {
return this;
}
}
আপনি যদি কোনও সম্পত্তি উপেক্ষা করতে চান তবে একটি প্রশ্ন চিহ্ন যুক্ত করে এটি বিকল্প হিসাবে চিহ্নিত করুন:
interface IPerson {
firstName: string;
lastName?: string;
}
এখন, একটি লাইব্রেরি রয়েছে যা টাইপস্ক্রিপ্টে দৃ strongly়ভাবে টাইপযুক্ত, প্রশ্নের যোগ্য সংগ্রহগুলি সরবরাহ করে।
এই সংগ্রহগুলি হ'ল:
গ্রন্থাগারটিকে ts-জেনেরিক-সংগ্রহ-লিনক বলা হয় ।
গিটহাবের উত্স কোড:
https://github.com/VeritasSoftware/ts-generic-collections
NPM:
https://www.npmjs.com/package/ts-generic-collections-linq
এই লাইব্রেরির সাহায্যে আপনি সংগ্রহগুলি তৈরি করতে (যেমন List<T>
) তৈরি করতে পারেন এবং নীচের মত দেখাচ্ছে সেগুলি জিজ্ঞাসা করতে পারেন ।
let owners = new List<Owner>();
let owner = new Owner();
owner.id = 1;
owner.name = "John Doe";
owners.add(owner);
owner = new Owner();
owner.id = 2;
owner.name = "Jane Doe";
owners.add(owner);
let pets = new List<Pet>();
let pet = new Pet();
pet.ownerId = 2;
pet.name = "Sam";
pet.sex = Sex.M;
pets.add(pet);
pet = new Pet();
pet.ownerId = 1;
pet.name = "Jenny";
pet.sex = Sex.F;
pets.add(pet);
//query to get owners by the sex/gender of their pets
let ownersByPetSex = owners.join(pets, owner => owner.id, pet => pet.ownerId, (x, y) => new OwnerPet(x,y))
.groupBy(x => [x.pet.sex])
.select(x => new OwnersByPetSex(x.groups[0], x.list.select(x => x.owner)));
expect(ownersByPetSex.toArray().length === 2).toBeTruthy();
expect(ownersByPetSex.toArray()[0].sex == Sex.F).toBeTruthy();
expect(ownersByPetSex.toArray()[0].owners.length === 1).toBeTruthy();
expect(ownersByPetSex.toArray()[0].owners.toArray()[0].name == "John Doe").toBeTruthy();
expect(ownersByPetSex.toArray()[1].sex == Sex.M).toBeTruthy();
expect(ownersByPetSex.toArray()[1].owners.length == 1).toBeTruthy();
expect(ownersByPetSex.toArray()[1].owners.toArray()[0].name == "Jane Doe").toBeTruthy();
Index signatures are incompatible.
Type '{ firstName: string; }' is not assignable to type 'IPerson'.
Property 'lastName' is missing in type '{ firstName: string; }'.