Mapped Types TypeScript এর একটি শক্তিশালী ফিচার যা আপনাকে অবজেক্ট টাইপের প্রতিটি প্রপার্টির জন্য একটি নতুন টাইপ তৈরি করতে সহায়তা করে। এটি টাইপ প্রোগ্রামিং এর মধ্যে একটি অত্যন্ত গুরুত্বপূর্ণ কনসেপ্ট, যা আপনাকে একটি টাইপের সমস্ত প্রপার্টি বা ফিল্ডের উপর ভিত্তি করে একটি নতুন টাইপ তৈরি করতে দেয়।
ম্যাপড টাইপ ব্যবহার করার মাধ্যমে আপনি টাইপের একটি প্যাটার্ন বা ফর্ম্যাট অটোমেটিকভাবে পরিবর্তন করতে পারেন, যা কোডের পুনঃব্যবহারযোগ্যতা ও দক্ষতা বৃদ্ধি করে।
১. Mapped Types এর বেসিক সিনট্যাক্স
Mapped Types তৈরি করার জন্য সাধারণত keyof এবং in কিওয়ার্ড ব্যবহার করা হয়। keyof কিওয়ার্ড টাইপের সমস্ত প্রপার্টির নাম বের করে এবং in কিওয়ার্ডের মাধ্যমে সেই প্রপার্টি নামের উপর অপারেশন করা হয়।
উদাহরণ:
type Person = {
name: string;
age: number;
isActive: boolean;
};
// Mapped Type তৈরি করা
type ReadOnlyPerson = {
readonly [K in keyof Person]: Person[K];
};
const person: ReadOnlyPerson = {
name: "John",
age: 30,
isActive: true
};
// person.name = "Alice"; // Error: Cannot assign to 'name' because it is a read-only property.
এখানে:
keyof Personটাইপটিname,age,isActiveপ্রপার্টি গুলোকে বের করে।[K in keyof Person]এর মাধ্যমে সেই প্রপার্টিগুলির উপর অ্যাক্সেস পেতে পারি।readonlyকীওয়ার্ড ব্যবহার করে প্রপার্টিগুলিকে রিড-অনলি (immutable) করা হয়েছে, অর্থাৎ এর মান পরিবর্তন করা যাবে না।
২. Mapped Types ব্যবহার করে Conditional Transformation
Mapped Types ব্যবহার করে আপনি একটি টাইপের প্রপার্টির মান পরিবর্তন করতে পারেন শর্তসাপেক্ষভাবে, যেমন string থেকে number তে পরিবর্তন করা বা তার বিপরীত।
উদাহরণ:
type Person = {
name: string;
age: number;
isActive: boolean;
};
type PersonWithStringValues = {
[K in keyof Person]: string; // সব প্রপার্টির মান string হবে
};
const person: PersonWithStringValues = {
name: "Alice",
age: "30", // এখন এটি string টাইপ হবে
isActive: "true" // এটি string হবে, boolean নয়
};
এখানে:
PersonWithStringValuesMapped Type এর মাধ্যমে, সমস্ত প্রপার্টির মানstringহিসেবে পরিবর্তন করা হয়েছে।
৩. Mapped Types with as and infer
আপনি as এবং infer কিওয়ার্ডও ব্যবহার করতে পারেন Mapped Types এর সাথে কিছু কাস্টম টাইপ তৈরি করতে।
উদাহরণ (Transforming values of specific types):
type Person = {
name: string;
age: number;
isActive: boolean;
};
type TransformedPerson = {
[K in keyof Person]: Person[K] extends boolean ? string : Person[K];
};
const transformedPerson: TransformedPerson = {
name: "Alice",
age: 25,
isActive: "true", // isActive now accepts a string instead of a boolean
};
এখানে:
Person[K] extends boolean ? string : Person[K]দ্বারা, শুধুbooleanটাইপ প্রপার্টির মানকেstringএ রূপান্তর করা হয়েছে।isActiveএর টাইপstringহয়ে গেছে, কিন্তুnameএবংageপ্রপার্টিগুলির মান অপরিবর্তিত রয়েছে।
৪. Partial এবং Required Mapped Types
TypeScript এ কিছু বিল্ট-ইন Mapped Types রয়েছে, যেমন Partial এবং Required, যেগুলি TypeScript এর সাথে আসা যায়।
Partial<T>: এটি একটি টাইপের সমস্ত প্রপার্টিকে ঐচ্ছিক (optional) বানিয়ে দেয়।Required<T>: এটি একটি টাইপের সমস্ত প্রপার্টিকে আবশ্যক (required) বানিয়ে দেয়।
উদাহরণ:
type Person = {
name: string;
age: number;
isActive: boolean;
};
// Partial type: সব প্রপার্টি ঐচ্ছিক হয়ে যাবে
type PartialPerson = Partial<Person>;
const partialPerson: PartialPerson = {
name: "Alice", // age এবং isActive optional
};
// Required type: সব প্রপার্টি আবশ্যক হবে
type RequiredPerson = Required<Person>;
const requiredPerson: RequiredPerson = {
name: "John",
age: 30,
isActive: true, // এখানে সব প্রপার্টি আবশ্যক
};
এখানে:
PartialPersonএ সমস্ত প্রপার্টি ঐচ্ছিক হয়েছে, তাই আপনি শুধুnameপ্রদান করতে পারেন।RequiredPersonএ সমস্ত প্রপার্টি আবশ্যক হয়েছে, তাই আপনাকে অবশ্যই সব প্রপার্টি প্রদান করতে হবে।
৫. Mapped Types with in এবং keyof
keyof এবং in এর সংমিশ্রণ আপনাকে আরও জটিল Mapped Types তৈরি করতে সাহায্য করে। আপনি এটি ব্যবহার করে সমস্ত প্রপার্টি নাম বা ভ্যালু চেইন করতে পারেন।
উদাহরণ:
type Person = {
name: string;
age: number;
isActive: boolean;
};
type Nullable<T> = {
[K in keyof T]: T[K] | null; // সব প্রপার্টির মান null সহ গ্রহণ করবে
};
type NullablePerson = Nullable<Person>;
const nullablePerson: NullablePerson = {
name: null, // name এখন null হতে পারে
age: 25,
isActive: null, // isActive এখন null হতে পারে
};
এখানে:
Nullable<T>Mapped Type তৈরি করছে যা সব প্রপার্টির টাইপকেnullসহ গ্রহণ করতে সক্ষম।
সারাংশ
TypeScript এর Mapped Types আপনাকে একটি টাইপের প্রতিটি প্রপার্টি বা ফিল্ডের উপর ভিত্তি করে নতুন টাইপ তৈরি করতে সাহায্য করে। এটি আপনাকে টাইপের চেহারা পরিবর্তন করতে, প্রপার্টির মান পরিবর্তন করতে বা সব প্রপার্টি ঐচ্ছিক বা আবশ্যক করতে সক্ষম করে। Mapped Types এর ব্যবহার কৌশলগুলো টাইপ নিরাপত্তা নিশ্চিত করতে সাহায্য করে এবং কোডকে আরও পুনঃব্যবহারযোগ্য ও স্থিতিশীল করে তোলে।