TypeScript-এ মডেলিং এবং ডেটা স্ট্রাকচার তৈরি করা একটি গুরুত্বপূর্ণ প্রক্রিয়া, যা আপনাকে আপনার অ্যাপ্লিকেশনের মধ্যে বিভিন্ন ধরণের ডেটা সংরক্ষণ ও পরিচালনা করতে সাহায্য করে। TypeScript-এর শক্তিশালী টাইপ সিস্টেম আপনাকে সঠিক টাইপ ব্যবহারের মাধ্যমে কোডের নির্ভুলতা এবং রিডেবিলিটি উন্নত করতে সহায়তা করে।
মডেলিং এবং ডেটা স্ট্রাকচার তৈরি করার মাধ্যমে আপনি এমন একটি কাঠামো তৈরি করতে পারবেন যা আপনার অ্যাপ্লিকেশন বা প্রকল্পের জন্য উপযুক্ত হবে।
TypeScript-এ মডেলিং
মডেলিং বলতে একটি নির্দিষ্ট ডেটার রূপ বা কাঠামো তৈরি করাকে বোঝানো হয়। TypeScript-এ মডেলিং সাধারণত ইন্টারফেস (Interfaces) এবং ক্লাস (Classes) ব্যবহার করে করা হয়। এগুলি আপনাকে আপনার ডেটা কাঠামো ঠিকভাবে সংজ্ঞায়িত করতে এবং কাজের সময় টাইপ চেকিং নিশ্চিত করতে সহায়তা করে।
ইন্টারফেস (Interfaces)
ইন্টারফেসগুলি ব্যবহার করে আপনি একটি অবজেক্টের কাঠামো (structure) বা টাইপ নির্ধারণ করতে পারেন। এটি ডেটা মডেলিং-এর জন্য সবচেয়ে সাধারণ এবং শক্তিশালী উপায়।
interface User {
id: number;
name: string;
email: string;
isAdmin: boolean;
}
const user: User = {
id: 1,
name: "John Doe",
email: "john@example.com",
isAdmin: false
};
এখানে User ইন্টারফেসের মাধ্যমে একটি ব্যবহারকারীর অবজেক্টের কাঠামো নির্ধারণ করা হয়েছে। এতে id, name, email, এবং isAdmin নামক প্রপার্টি রয়েছে এবং তাদের টাইপও নির্ধারিত।
ক্লাস (Classes)
TypeScript-এ আপনি ক্লাস ব্যবহার করে ডেটা মডেল তৈরি করতে পারেন যা অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) ধারণার ভিত্তিতে কাজ করে।
class Product {
constructor(
public id: number,
public name: string,
public price: number
) {}
getDescription(): string {
return `${this.name} costs $${this.price}`;
}
}
const product = new Product(101, "Laptop", 999.99);
console.log(product.getDescription()); // Output: Laptop costs $999.99
এখানে Product ক্লাসটি একটি পণ্য (product) মডেল তৈরি করেছে যেখানে id, name, এবং price প্রপার্টি রয়েছে। getDescription() ফাংশনটি পণ্যের বিবরণ প্রদান করবে।
TypeScript-এ ডেটা স্ট্রাকচার
TypeScript-এ বিভিন্ন ধরনের ডেটা স্ট্রাকচার তৈরি করা যায়, যেমন অ্যারে (arrays), টুপল (tuples), সেট (sets), ম্যাপ (maps), এবং এগুলির সাথে কাজ করা। নিচে কিছু সাধারণ ডেটা স্ট্রাকচারের উদাহরণ দেওয়া হলো।
অ্যারে (Arrays)
TypeScript-এ অ্যারে একটি গুরুত্বপূর্ণ ডেটা স্ট্রাকচার। এখানে টাইপের সাহায্যে অ্যারের উপাদানগুলোর ধরন নির্ধারণ করা যায়।
let numbers: number[] = [1, 2, 3, 4, 5];
let names: string[] = ["Alice", "Bob", "Charlie"];
এখানে numbers একটি সংখ্যার অ্যারে এবং names একটি স্ট্রিংয়ের অ্যারে।
টুপল (Tuples)
টুপল একটি অ্যারে টাইপ যা নির্দিষ্ট সংখ্যক উপাদান ধারণ করতে পারে, এবং প্রতিটি উপাদান আলাদা টাইপের হতে পারে।
let tuple: [number, string, boolean] = [1, "Hello", true];
এখানে tuple একটি টুপল যা প্রথম উপাদানে number, দ্বিতীয় উপাদানে string, এবং তৃতীয় উপাদানে boolean ধারণ করছে।
সেট (Set)
Set একটি ডেটা স্ট্রাকচার যা একক মানের সেট রাখে এবং প্রতিটি মান একবারই থাকে (duplicate entry এড়িয়ে চলে)। TypeScript-এ সেটের টাইপ ব্যবহার করা সহজ।
let uniqueNumbers: Set<number> = new Set([1, 2, 3, 4, 5, 5, 6]);
console.log(uniqueNumbers); // Output: Set { 1, 2, 3, 4, 5, 6 }
এখানে uniqueNumbers একটি সেট যা শুধুমাত্র ইউনিক সংখ্যা ধারণ করবে, এবং ৫টি পুনরাবৃত্তি বাদ দেবে।
ম্যাপ (Map)
Map একটি ডেটা স্ট্রাকচার যা কী এবং মানের জোড়া (key-value pairs) ধারণ করে। TypeScript-এ ম্যাপ তৈরি করা খুব সহজ।
let personMap: Map<string, string> = new Map();
personMap.set("name", "John");
personMap.set("email", "john@example.com");
console.log(personMap.get("name")); // Output: John
console.log(personMap.get("email")); // Output: john@example.com
এখানে personMap একটি ম্যাপ যেখানে কী হিসেবে স্ট্রিং এবং মান হিসেবে স্ট্রিং রয়েছে।
কাস্টম ডেটা স্ট্রাকচার
TypeScript-এ আপনি কাস্টম ডেটা স্ট্রাকচার তৈরি করতে পারেন যা আপনার অ্যাপ্লিকেশনের চাহিদা অনুযায়ী সম্পূর্ণরূপে কাস্টমাইজড হবে। উদাহরণস্বরূপ, আপনি একটি স্ট্যাক (stack) বা কিউ (queue) ডেটা স্ট্রাকচার তৈরি করতে পারেন:
class Stack<T> {
private items: T[] = [];
push(item: T): void {
this.items.push(item);
}
pop(): T | undefined {
return this.items.pop();
}
peek(): T | undefined {
return this.items[this.items.length - 1];
}
isEmpty(): boolean {
return this.items.length === 0;
}
}
const stack = new Stack<number>();
stack.push(10);
stack.push(20);
console.log(stack.pop()); // Output: 20
এখানে Stack একটি কাস্টম ডেটা স্ট্রাকচার যা শুধুমাত্র নির্দিষ্ট টাইপের ডেটা ধারণ করতে পারে (এখানে number টাইপের ডেটা)।
উপসংহার
TypeScript-এ মডেলিং এবং ডেটা স্ট্রাকচার ব্যবহারের মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনের ডেটা এবং কোডের কাঠামো সুসংগঠিত এবং সহজে বজায় রাখতে পারেন। ইন্টারফেস, ক্লাস, অ্যারে, টুপল, সেট, এবং ম্যাপের মতো ডেটা স্ট্রাকচারগুলি ব্যবহার করে আপনি আরও পঠনযোগ্য এবং শক্তিশালী অ্যাপ্লিকেশন তৈরি করতে পারবেন। TypeScript-এর শক্তিশালী টাইপ সিস্টেমের সাহায্যে আপনার কোডে ত্রুটি চিহ্নিত করা সহজ হয়, যা ডেভেলপমেন্টের সময় আপনাকে সহায়তা করে।
TypeScript এ টাইপিং খুবই গুরুত্বপূর্ণ, কারণ এটি কোডের মান এবং নিরাপত্তা নিশ্চিত করে। অবজেক্ট টাইপিং (Object Typing) এবং এরে টাইপিং (Array Typing) এর মাধ্যমে আপনি আপনার কোডের বিভিন্ন উপাদানের টাইপ নির্ধারণ করতে পারেন, যা কোডের কার্যকারিতা এবং ব্যবহারের সময় সমস্যা কমিয়ে দেয়।
১. অবজেক্ট টাইপিং (Object Typing)
TypeScript এ আপনি অবজেক্ট টাইপ করতে পারেন যাতে এর প্রপার্টি এবং তাদের টাইপ নির্দিষ্ট থাকে। আপনি সাধারণত অবজেক্ট টাইপের জন্য ইন্টারফেস (interface) বা টাইপ (type) ব্যবহার করেন।
অবজেক্ট টাইপিং - ইন্টারফেস ব্যবহার:
interface Person {
name: string;
age: number;
greet(): void;
}
const person: Person = {
name: "John",
age: 30,
greet() {
console.log(`Hello, my name is ${this.name}`);
}
};
person.greet(); // Output: Hello, my name is John
এখানে Person নামে একটি ইন্টারফেস তৈরি করা হয়েছে, যা name, age এবং greet মেথডের টাইপ নির্দিষ্ট করে। এর মাধ্যমে আপনি একটি অবজেক্টের কাঠামো সুনির্দিষ্ট করে দিতে পারেন।
অবজেক্ট টাইপিং - টাইপ ব্যবহার:
type Person = {
name: string;
age: number;
greet(): void;
};
const person: Person = {
name: "Alice",
age: 25,
greet() {
console.log(`Hello, my name is ${this.name}`);
}
};
person.greet(); // Output: Hello, my name is Alice
এখানে, টাইপ Person ব্যবহার করা হয়েছে, যা name, age এবং greet মেথডের কাঠামো নির্ধারণ করে।
২. এরে টাইপিং (Array Typing)
এরে টাইপিং দ্বারা আপনি একটি এরে এর উপাদানগুলোর টাইপ নির্ধারণ করতে পারেন। TypeScript এ এরে টাইপিং দুইভাবে করা যায়:
- এরে টাইপ সংজ্ঞায়ন (
Array<Type>) - টাইপ অ্যারের মাধ্যমে (
Type[])
এরে টাইপিং - Array<Type> ব্যবহার:
let numbers: Array<number> = [1, 2, 3, 4];
numbers.push(5); // Valid
numbers.push("6"); // Error: Argument of type 'string' is not assignable to parameter of type 'number'.
এখানে numbers একটি Array<number> টাইপের এরে, অর্থাৎ এটি শুধুমাত্র সংখ্যার এরে হতে পারে।
এরে টাইপিং - Type[] ব্যবহার:
let strings: string[] = ["apple", "banana", "cherry"];
strings.push("orange"); // Valid
strings.push(1); // Error: Argument of type 'number' is not assignable to parameter of type 'string'.
এখানে strings একটি string[] টাইপের এরে, অর্থাৎ এটি শুধুমাত্র স্ট্রিংয়ের এরে হতে পারে।
৩. এরে অবজেক্ট টাইপিং (Array of Objects)
TypeScript এ আপনি একটি অবজেক্টের এরে তৈরি করতে পারেন, যেখানে প্রতিটি অবজেক্টের টাইপ নির্দিষ্ট থাকে। এই কাজটি করার জন্য, আপনি অবজেক্ট টাইপিং ও এরে টাইপিং একসাথে ব্যবহার করবেন।
উদাহরণ:
type Product = {
name: string;
price: number;
};
const products: Product[] = [
{ name: "Laptop", price: 1200 },
{ name: "Smartphone", price: 800 }
];
console.log(products[0].name); // Output: Laptop
এখানে products একটি Product[] টাইপের এরে, অর্থাৎ এটি name এবং price প্রপার্টি সহ অবজেক্টের একটি এরে।
৪. টাপল টাইপ (Tuple Type)
টাপল (Tuple) টাইপ হচ্ছে একটি এরে যার মধ্যে নির্দিষ্ট সংখ্যক উপাদান থাকতে হবে এবং প্রতিটি উপাদানের টাইপ আলাদা হতে পারে। TypeScript এ আপনি টাপল টাইপের মাধ্যমে এমন এরে তৈরি করতে পারেন যেখানে প্রতিটি উপাদান একটি নির্দিষ্ট টাইপের।
উদাহরণ:
let tuple: [string, number, boolean] = ["Alice", 30, true];
console.log(tuple[0]); // Output: Alice
console.log(tuple[1]); // Output: 30
console.log(tuple[2]); // Output: true
এখানে tuple একটি টাপল টাইপ, যেখানে প্রথম উপাদানটি string, দ্বিতীয়টি number, এবং তৃতীয়টি boolean টাইপের।
৫. এরে ও অবজেক্টের মধ্যে পার্থক্য
- এরে টাইপিং: এরে টাইপিং সাধারণত এক ধরনের উপাদান ধারণ করতে ব্যবহৃত হয় (যেমন সংখ্যার এরে, স্ট্রিংয়ের এরে ইত্যাদি)।
- অবজেক্ট টাইপিং: অবজেক্ট টাইপিংয়ে আপনি একাধিক প্রপার্টি, ফাংশন, বা ভেরিয়েবলগুলো নির্দিষ্ট টাইপের সঙ্গে সংজ্ঞায়িত করতে পারেন, যা একটি কাঠামো গঠন করে।
৬. উপসংহার
TypeScript এর মাধ্যমে আপনি সহজেই অবজেক্ট এবং এরে টাইপিং করতে পারেন, যা কোডের স্ট্রং টাইপ সেফটি নিশ্চিত করে। আপনি interface বা type ব্যবহার করে অবজেক্টের কাঠামো নির্ধারণ করতে পারেন, এবং Array<Type> বা Type[] ব্যবহার করে এরে টাইপিং করতে পারেন। এছাড়া টাপল টাইপের মাধ্যমে আপনি একাধিক টাইপের উপাদান নিয়ে একটি নির্দিষ্ট দৈর্ঘ্যের এরে তৈরি করতে পারেন। এইসব ফিচার TypeScript এর শক্তিশালী টাইপ সিস্টেমকে আরও কার্যকর এবং নিরাপদ করে তোলে।
TypeScript-এ ইন্টারফেস এবং টাইপ ইন্টারফেস উভয়ই ডেটা শেপ বা স্ট্রাকচার সংজ্ঞায়িত করার জন্য ব্যবহৃত হয়। তবে তাদের ব্যবহারের মধ্যে কিছু পার্থক্য এবং ক্ষেত্রভেদে উপকারিতা রয়েছে। এই টিউটোরিয়ালে আমরা ইন্টারফেস এবং টাইপ ইন্টারফেস এর মধ্যে পার্থক্য এবং তাদের ব্যবহার বিস্তারিতভাবে আলোচনা করব।
১. ইন্টারফেস (Interface)
ইন্টারফেস TypeScript-এ এমন একটি গঠনগত ডেটা টাইপ যা ক্লাস বা অবজেক্টের জন্য প্রোপার্টি এবং মেথডের একটি কন্ট্রাক্ট (চুক্তি) নির্ধারণ করে। আপনি যখন একটি ইন্টারফেস তৈরি করেন, তখন এটি একটি স্ট্রাকচার ডিফাইন করে যা ক্লাস বা অবজেক্ট মেনে চলবে।
উদাহরণ:
interface Person {
name: string;
age: number;
greet(): void;
}
const person1: Person = {
name: "Alice",
age: 25,
greet() {
console.log(`Hello, my name is ${this.name}`);
}
};
person1.greet(); // Output: Hello, my name is Alice
এখানে Person একটি ইন্টারফেস যা একটি অবজেক্টের জন্য name, age প্রোপার্টি এবং greet মেথডের কাঠামো নির্ধারণ করছে। person1 ইন্টারফেসটি অনুসরণ করে তৈরি করা হয়েছে।
ইন্টারফেসের সুবিধা:
- এক্সটেনশন: একাধিক ইন্টারফেস একত্রে এক্সটেন্ড করা যেতে পারে।
- ক্লাসে প্রয়োগ: ইন্টারফেস একটি ক্লাসে প্রয়োগ করা যায়, যেখানে ক্লাস সেই ইন্টারফেসের সবগুলো মেথড ও প্রোপার্টি প্রদান করতে বাধ্য।
- কমপ্লেক্স টাইপ ডিফাইন করা: বড় এবং জটিল টাইপ স্ট্রাকচার সহজেই সংজ্ঞায়িত করা যায়।
২. টাইপ ইন্টারফেস (Type Interface)
টাইপ ইন্টারফেস কোনো ইন্টারফেসের মতোই ডেটা টাইপ বা স্ট্রাকচার সংজ্ঞায়িত করতে ব্যবহৃত হয়, তবে এখানে টাইপ অ্যালিয়াস ব্যবহার করা হয়। টাইপ এবং ইন্টারফেস প্রায় একই কাজ করে, কিন্তু তাদের কিছু পার্থক্য রয়েছে, বিশেষত এক্সটেনশন এবং মর্জিং এর ক্ষেত্রে।
উদাহরণ:
type Person = {
name: string;
age: number;
greet(): void;
};
const person2: Person = {
name: "Bob",
age: 30,
greet() {
console.log(`Hi, I'm ${this.name}`);
}
};
person2.greet(); // Output: Hi, I'm Bob
এখানে Person একটি টাইপ অ্যালিয়াস যা name, age প্রোপার্টি এবং greet মেথড ধারণ করে। person2 টাইপটি অনুসরণ করে তৈরি করা হয়েছে।
টাইপ ইন্টারফেসের সুবিধা:
- একটি ফাংশন বা ভেরিয়েবল টাইপ হিসেবে ব্যবহার: টাইপ দিয়ে আপনি শুধু অবজেক্ট টাইপই নয়, ফাংশন বা অ্যারের টাইপও ডিফাইন করতে পারেন।
- একাধিক টাইপ একত্রিত করা: টাইপের মাধ্যমে ইউনিয়ন (union) বা ইন্টারসেকশন (intersection) টাইপ তৈরি করা সম্ভব।
৩. টাইপ এবং ইন্টারফেসের মধ্যে পার্থক্য
TypeScript-এ টাইপ এবং ইন্টারফেস প্রায় সমান কাজ করে, তবে তাদের মধ্যে কিছু পার্থক্য রয়েছে। নিচে তাদের মধ্যে প্রধান পার্থক্যগুলোর আলোচনা করা হলো:
১. এক্সটেনশন (Extending)
ইন্টারফেস একাধিক ইন্টারফেস একসাথে এক্সটেন্ড (extend) করতে পারে। এটি মর্জিং (Merging) সাপোর্ট করে, যার মানে একই নামের ইন্টারফেস একাধিকবার ডিফাইন করা সম্ভব এবং TypeScript তাদের একত্রে মিশিয়ে দেয়।
interface Animal { name: string; } interface Dog extends Animal { breed: string; } const myDog: Dog = { name: "Buddy", breed: "Golden Retriever" };টাইপ একাধিক টাইপ একসাথে মিশাতে পারে, তবে এটি মর্জিং সাপোর্ট করে না। এর মানে হল যে, যদি একই নামের টাইপ অ্যালিয়াস ঘোষণা করা হয়, তবে তারা ওভাররাইড হয়ে যাবে।
type Animal = { name: string; }; type Dog = Animal & { breed: string }; const myDog: Dog = { name: "Buddy", breed: "Golden Retriever" };
২. মর্জিং (Merging)
ইন্টারফেস একই নামের একাধিক ডিফিনিশন একত্রে মিশিয়ে দিতে পারে। এটি ডিক্লারেটিভ মর্জিং (declarative merging) হিসেবে পরিচিত।
interface Person { name: string; } interface Person { age: number; } const person: Person = { name: "Alice", age: 25 }; // No error, merging happensটাইপ মর্জিং সাপোর্ট করে না, যদি আপনি একই নামের টাইপ দুইবার ঘোষণা করেন তবে তা কম্পাইল টাইম এরর দিবে।
type Person = { name: string; }; // Error: Duplicate identifier 'Person'. type Person = { age: number; };
৩. টাইপ এবং ইন্টারফেসের ব্যবহার ক্ষেত্রে পার্থক্য
- ইন্টারফেস সাধারণত অবজেক্ট, ক্লাস বা ফাংশনের স্ট্রাকচার ডিফাইন করার জন্য ব্যবহার হয়।
- টাইপ আরও জেনেরিক এবং ফাংশন, ইউনিয়ন টাইপ, বা ইন্টারসেকশন টাইপ ডিফাইন করার জন্য উপযুক্ত।
৪. কোনটি ব্যবহার করবেন?
- আপনি যখন অবজেক্টের স্ট্রাকচার বা ক্লাসের জন্য কন্ট্রাক্ট (contract) তৈরি করতে চান, তখন ইন্টারফেস ব্যবহার করা সবচেয়ে ভাল।
- আপনি যদি কাস্টম টাইপ তৈরি করতে চান, যেমন ইউনিয়ন টাইপ বা ফাংশন টাইপ, তবে টাইপ অ্যালিয়াস (type alias) ব্যবহার করা উত্তম।
সারাংশ
ইন্টারফেস এবং টাইপ TypeScript-এ অবজেক্টের স্ট্রাকচার বা টাইপ সংজ্ঞায়িত করার জন্য ব্যবহৃত হয়। যদিও তাদের কাজ প্রায় সমান, তবে কিছু পার্থক্য রয়েছে যেমন মর্জিং, এক্সটেনশন, এবং টাইপের ব্যবহার। সাধারণত ইন্টারফেস ক্লাস ও অবজেক্টের জন্য এবং টাইপ আরও জেনেরিক টাইপ ডিফাইন করার জন্য ব্যবহৃত হয়।
TypeScript-এ ক্লাস (Class) ব্যবহারের মাধ্যমে আপনি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) কনসেপ্টের সাহায্যে কোড লিখতে পারেন। TypeScript-এর ক্লাস কনস্ট্রাক্টর, প্রপার্টি, মেথড, ইনহেরিটেন্স, অ্যাবস্ট্রাক্ট ক্লাস, ইন্টারফেস ইত্যাদি বিভিন্ন ফিচার সাপোর্ট করে, যা কোডকে আরও মডুলার, পুনঃব্যবহারযোগ্য এবং রিডেবল করে তোলে।
১. ক্লাস ডিফিনিশন (Class Definition)
ক্লাস হলো একটি ব্লুপ্রিন্ট, যা অবজেক্ট তৈরি করতে ব্যবহৃত হয়। TypeScript-এ ক্লাস ডিফাইন করার জন্য class কিওয়ার্ড ব্যবহার করা হয়।
ক্লাস ডিফিনিশনের উদাহরণ:
class Person {
// প্রপার্টি ডিক্লেয়ারেশন
name: string;
age: number;
// কনস্ট্রাক্টর (Constructor)
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
// মেথড ডিফিনিশন
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
এখানে:
nameএবংageক্লাসের প্রপার্টি।constructorমেথডটি ক্লাসের ইনস্ট্যান্স তৈরি করার সময় অর্গুমেন্ট নেয়।greetএকটি মেথড যা অবজেক্টের গ্রীটিং বার্তা প্রিন্ট করে।
২. অবজেক্ট ইন্সট্যান্সিং (Object Instancing)
ক্লাস ডিফাইন করার পর আপনি সেই ক্লাসের একটি ইনস্ট্যান্স তৈরি করতে পারেন। ইনস্ট্যান্স তৈরি করতে new কিওয়ার্ড ব্যবহার করা হয়। এটি ক্লাসের কনস্ট্রাক্টর মেথডকে কল করে এবং নতুন অবজেক্ট তৈরি করে।
উদাহরণ:
const person1 = new Person("John", 30);
person1.greet(); // Output: Hello, my name is John and I am 30 years old.
এখানে:
person1হলোPersonক্লাসের একটি ইনস্ট্যান্স, যেখানে কনস্ট্রাক্টরের মাধ্যমেnameওageসেট করা হয়েছে।
৩. ক্লাসের কনস্ট্রাক্টর মেথড
কনস্ট্রাক্টর একটি বিশেষ মেথড যা ক্লাসের ইনস্ট্যান্স তৈরি করার সময় স্বয়ংক্রিয়ভাবে কল হয়। এটি সাধারণত ক্লাসের প্রপার্টি ইন্টারনাল স্টেট ইনিশিয়ালাইজ করতে ব্যবহৃত হয়।
উদাহরণ:
class Car {
model: string;
year: number;
constructor(model: string, year: number) {
this.model = model;
this.year = year;
}
displayInfo() {
console.log(`Car model: ${this.model}, Year: ${this.year}`);
}
}
const myCar = new Car("Toyota", 2020);
myCar.displayInfo(); // Output: Car model: Toyota, Year: 2020
এখানে, Car ক্লাসের কনস্ট্রাক্টর মেথড model এবং year সেট করে, এবং displayInfo মেথড দিয়ে তাদের প্রদর্শন করা হয়।
৪. ক্লাসের প্রপার্টি (Class Properties)
ক্লাসের প্রপার্টি ডিফাইন করার জন্য সাধারণত ভেরিয়েবল ডিক্লেয়ার করা হয়, যেগুলো ক্লাসের ইনস্ট্যান্সের মাধ্যমে অ্যাক্সেস করা যায়।
উদাহরণ:
class Animal {
species: string;
constructor(species: string) {
this.species = species;
}
speak() {
console.log(`${this.species} makes a sound.`);
}
}
const animal = new Animal("Dog");
animal.speak(); // Output: Dog makes a sound.
এখানে, species হলো Animal ক্লাসের একটি প্রপার্টি এবং এটি কনস্ট্রাক্টরের মাধ্যমে সেট করা হচ্ছে।
৫. ক্লাসে মেথড (Methods in Class)
ক্লাসের ভিতরে মেথড ডিফাইন করা হয়, যা ক্লাসের ইনস্ট্যান্সের সাথে সম্পর্কিত ফাংশনালিটি প্রদান করে।
উদাহরণ:
class Calculator {
add(a: number, b: number): number {
return a + b;
}
subtract(a: number, b: number): number {
return a - b;
}
}
const calc = new Calculator();
console.log(calc.add(10, 5)); // Output: 15
console.log(calc.subtract(10, 5)); // Output: 5
এখানে, add এবং subtract দুটি মেথড ডিফাইন করা হয়েছে, যা দুটি সংখ্যা গোনে যোগ এবং বিয়োগ করার কাজ করে।
৬. ক্লাসের ইনহেরিটেন্স (Class Inheritance)
TypeScript-এ ক্লাস ইনহেরিটেন্স (Inheritance) সাপোর্ট করে, যা একটি ক্লাসের বৈশিষ্ট্য এবং মেথড অন্য একটি ক্লাসে উত্তরাধিকারসূত্রে পেতে সক্ষম করে।
উদাহরণ:
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a sound.`);
}
}
class Dog extends Animal {
constructor(name: string) {
super(name); // Call the parent class constructor
}
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog("Buddy");
dog.speak(); // Output: Buddy barks.
এখানে, Dog ক্লাস Animal ক্লাস থেকে ইনহেরিট করেছে এবং speak মেথডের ওপরে নিজের সংস্করণ প্রদান করেছে।
৭. অ্যাবস্ট্রাক্ট ক্লাস (Abstract Classes)
TypeScript-এ অ্যাবস্ট্রাক্ট ক্লাস একটি বিশেষ ধরনের ক্লাস যা সরাসরি ইনস্ট্যান্স তৈরি করতে পারে না, কিন্তু এটি অন্য ক্লাসের জন্য একটি বেস ক্লাস হিসেবে কাজ করে।
উদাহরণ:
abstract class Animal {
abstract sound(): void; // Abstract method
move(): void {
console.log("The animal moves.");
}
}
class Cat extends Animal {
sound(): void {
console.log("Meow");
}
}
const cat = new Cat();
cat.sound(); // Output: Meow
cat.move(); // Output: The animal moves.
এখানে, Animal একটি অ্যাবস্ট্রাক্ট ক্লাস এবং Cat ক্লাস এটি এক্সটেন্ড করে sound মেথড ইমপ্লিমেন্ট করেছে।
সারাংশ
TypeScript-এ ক্লাস এবং অবজেক্ট ইন্সট্যান্সিং ব্যবহারের মাধ্যমে আপনি উন্নত অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) কনসেপ্ট প্রয়োগ করতে পারেন। ক্লাস ডিফিনিশন, প্রপার্টি, কনস্ট্রাক্টর, মেথড, ইনহেরিটেন্স, এবং অ্যাবস্ট্রাক্ট ক্লাস এর মাধ্যমে কোডকে আরও সংগঠিত ও পুনঃব্যবহারযোগ্য করা সম্ভব। TypeScript-এ এই সমস্ত বৈশিষ্ট্যগুলি ব্যবহারের ফলে কোডের সঠিকতা এবং রিডেবিলিটি উন্নত হয়।
স্ট্রাকচারাল টাইপ সিস্টেম TypeScript এর একটি মৌলিক ধারণা, যা টাইপ চেকিংয়ের ক্ষেত্রে টাইপের কাঠামো (structure) বা গঠনকে প্রধান হিসেবে নেয়, অর্থাৎ কোন অবজেক্টের প্রপার্টি ও তার টাইপ কীভাবে গঠন করা হয়েছে, তা দেখে টাইপ চেকিং করা হয়। এটি ডাক টাইপিং (Duck Typing) নামে পরিচিত, যেখানে "If it looks like a duck and quacks like a duck, it must be a duck" এই প্রবাদটি মান্য করা হয়।
TypeScript এর স্ট্রাকচারাল টাইপ সিস্টেমের মাধ্যমে, আপনি যদি দুটি অবজেক্টে একই গঠন বা কাঠামো (structure) থাকে, তবে TypeScript তাদের একই টাইপ হিসেবে মান্য করে, এমনকি তাদের নাম বা টাইপ আলাদা হলেও।
স্ট্রাকচারাল টাইপ সিস্টেমের মৌলিক ধারণা
স্ট্রাকচারাল টাইপিং হল এমন একটি পদ্ধতি, যেখানে টাইপের তুলনা এনক্যাপসুলেশন বা অবজেক্টের কন্টেন্ট (বিষয়বস্তু) দ্বারা করা হয়, অথবা ফাংশনের সিগনেচার দ্বারা, টাইপের নামের উপর ভিত্তি না করে। এর মানে হল যে, দুটি আলাদা টাইপ, যদি একই স্ট্রাকচার (গঠন) থাকে, তবে TypeScript তাদেরকে সমান বলে গণ্য করবে।
উদাহরণ:
interface Person {
name: string;
age: number;
}
const john = { name: "John", age: 30 };
const jane = { name: "Jane", age: 25 };
function greet(person: Person) {
console.log(`Hello, ${person.name}`);
}
greet(john); // Works fine
greet(jane); // Works fine
এখানে, john এবং jane উভয়েরই একই গঠন রয়েছে, তাদের নাম এবং বয়স। TypeScript তাদের একই টাইপ হিসেবে মান্য করেছে, কারণ তাদের গঠন Person ইন্টারফেসের সাথে মিলে যাচ্ছে।
স্ট্রাকচারাল টাইপিং এর বৈশিষ্ট্য
- টাইপের গঠন দেখেই তুলনা করা হয়: TypeScript এর স্ট্রাকচারাল টাইপ সিস্টেমে, দুটি অবজেক্টের প্রপার্টির নাম এবং টাইপ দেখে তাদের মধ্যে সমতা নির্ধারণ করা হয়।
- অবজেক্টের কাঠামো সমান হলে টাইপ একে অপরকে মান্য করে: যদি দুটি অবজেক্টের কাঠামো একই হয়, তবে TypeScript তাদেরকে একই টাইপ হিসেবে গণ্য করে।
- টাইপের নামের সাথে কোন সম্পর্ক নেই: স্ট্রাকচারাল টাইপ সিস্টেমে টাইপের নাম একটি বড় ব্যাপার নয়। যদি দুটি অবজেক্টের কাঠামো (structure) একই হয়, তবে TypeScript তাদেরকে সমান বলে গণ্য করবে।
স্ট্রাকচারাল টাইপ সিস্টেমের উদাহরণ
উদাহরণ ১: স্ট্রাকচারাল টাইপিং
interface Animal {
name: string;
sound: string;
}
const dog = { name: "Dog", sound: "Bark" };
const cat = { name: "Cat", sound: "Meow" };
function makeSound(animal: Animal) {
console.log(`${animal.name} says ${animal.sound}`);
}
makeSound(dog); // Output: Dog says Bark
makeSound(cat); // Output: Cat says Meow
এখানে, dog এবং cat এর গঠন Animal ইন্টারফেসের সাথে মেলে, তাই TypeScript তাদেরকে একই টাইপ হিসেবে গণ্য করেছে। তাদের নাম এবং সাউন্ড প্রপার্টি একই ধরনের টাইপ ধারণ করে, যদিও তাদের নাম আলাদা।
উদাহরণ ২: স্ট্রাকচারাল টাইপিং এর মাধ্যমে কমপ্লেক্স অবজেক্ট
interface Employee {
name: string;
age: number;
position: string;
}
const emp1 = { name: "John", age: 28, position: "Developer" };
const emp2 = { name: "Jane", age: 32, position: "Manager" };
function showEmployeeDetails(employee: Employee) {
console.log(`${employee.name} is a ${employee.position}`);
}
showEmployeeDetails(emp1); // Output: John is a Developer
showEmployeeDetails(emp2); // Output: Jane is a Manager
এখানে emp1 এবং emp2 এর গঠন Employee ইন্টারফেসের সাথে মিলে যাচ্ছে, তাই TypeScript তাদেরকে একই টাইপ হিসেবে গণ্য করছে, যদিও তারা ভিন্ন ভিন্ন অবজেক্ট।
স্ট্রাকচারাল টাইপিং এর সঙ্গে নেমস্পেস সম্পর্কিত উদাহরণ
TypeScript এ স্ট্রাকচারাল টাইপিং তখনও কাজ করে যখন টাইপগুলোর নাম আলাদা থাকে, যতক্ষণ না তাদের কাঠামো এক। এখানে একটি উদাহরণ দেওয়া হলো:
interface Car {
wheels: number;
engine: string;
}
interface Vehicle {
wheels: number;
engine: string;
}
const car: Car = { wheels: 4, engine: "V8" };
const vehicle: Vehicle = { wheels: 4, engine: "V8" };
function drive(vehicle: Vehicle) {
console.log(`Driving a vehicle with ${vehicle.wheels} wheels and a ${vehicle.engine} engine.`);
}
drive(car); // Output: Driving a vehicle with 4 wheels and a V8 engine.
এখানে Car এবং Vehicle ইন্টারফেসের নাম আলাদা, তবে গঠন (structure) এক, তাই TypeScript উভয়কেই সমান টাইপ হিসেবে গণ্য করেছে এবং car অবজেক্টকে drive ফাংশনে পাস করা হয়েছে।
TypeScript এর স্ট্রাকচারাল টাইপ সিস্টেম আপনাকে টাইপের নামের পরিবর্তে টাইপের গঠন বা কাঠামো দিয়ে টাইপ চেকিং করার সুযোগ দেয়। এটি TypeScript কে অনেক বেশি নমনীয় এবং শক্তিশালী করে তোলে, কারণ আপনি কেবল নির্দিষ্ট প্রপার্টি এবং টাইপের মেলবন্ধন দিয়ে টাইপ চেক করতে পারবেন। এর মাধ্যমে কোড আরো বেশি পঠনযোগ্য, উন্নত এবং নির্ভরযোগ্য হয়।
Read more