মূল কন্টেন্টে যান
মডিউল 3 · 2-এর পাঠ 2কোর্সে 6/14~15 min
মডিউল পাঠ (2/2)

মৌলিক জেনেরিক

জেনারিকস (জেনারিক প্রোগ্রামিং) হল টাইপস্ক্রিপ্টের অন্যতম শক্তিশালী বৈশিষ্ট্য। তারা আপনাকে নমনীয়, পুনঃব্যবহারযোগ্য উপাদান, ফাংশন এবং ইন্টারফেসগুলি লিখতে দেয় যা বিভিন্ন ডেটা প্রকারের সাথে কাজ করতে পারে যখন সর্বোচ্চ প্রকারের নিরাপত্তা বজায় রাখে এবং any এর ব্যবহার এড়িয়ে যায়।


জেনেরিক ফাংশন

প্রকারের জন্য একটি পরিবর্তনশীল হিসাবে একটি জেনেরিককে ভাবুন। আসুন একটি ফাংশন বিবেচনা করি যা একটি যুক্তি হিসাবে এটিতে পাস করা মান ফিরিয়ে দেয়:

TS
function identity<T>(arg: T): T {
  return arg;
}

অক্ষর T (Type এর জন্য ছোট) টাইপের জন্য একটি স্থানধারক। যখন আমরা identity কল করি, TypeScript পাস করা আর্গুমেন্টের ধরন ক্যাপচার করে এবং স্বয়ংক্রিয়ভাবে T কে সেই প্রকারে সেট করে:

TS
const str = identity<string>('Hello'); // T is string
const num = identity(42); // T is number (automatically inferred!)

জেনেরিক ইন্টারফেস এবং উপনাম

জেনেরিকগুলি ইন্টারফেসেও প্রয়োগ করা যেতে পারে এবং জেনেরিক কন্টেইনার বা ডেটা স্ট্রাকচার সংজ্ঞায়িত করার জন্য উপনাম টাইপ করা যেতে পারে:

TS
interface Box<T> {
  content: T;
}

const stringBox: Box<string> = { content: 'TypeScript' };
const numberBox: Box<number> = { content: 42 };

একাধিক প্রকার পরামিতি

আমরা একাধিক ধরনের ভেরিয়েবল ব্যবহার করে এমন ফাংশন বা প্রকারগুলিকে সংজ্ঞায়িত করতে পারি (যেমন, T এবং U):

TS
function mergeObjects<T, U>(obj1: T, obj2: U): T & U {
  return { ...obj1, ...obj2 };
}

সাধারণ সীমাবদ্ধতা

কখনও কখনও আমরা জেনেরিক দ্বারা গৃহীত প্রকারগুলিকে সীমাবদ্ধ করতে চাই। সীমাবদ্ধতা যোগ করতে আমরা extends কীওয়ার্ড ব্যবহার করতে পারি।

উদাহরণস্বরূপ, যদি আমরা চাই যে জেনেরিক টাইপের সর্বদা একটি length প্রপার্টি থাকুক (যেমন স্ট্রিং বা অ্যারে):

TS
interface HasLength {
  length: number;
}

function logLength<T extends HasLength>(arg: T): void {
  console.log(arg.length); // Safe! We know arg has 'length'
}

logLength('Hello'); // Valid
logLength([1, 2, 3]); // Valid
// logLength(42); // Error: number does not have a length property!

নিজে চেষ্টা করে দেখুন

ব্যায়াম 1: জেনেরিক আইডেন্টিটি ফাংশন

ব্যায়াম#ts.m3.l2.e1
প্রচেষ্টা: 0লোড হচ্ছে...

জেনেরিক আইডেন্টিটি ফাংশনটি সম্পূর্ণ করুন যাতে এটি জেনেরিক টাইপ T-এর একটি মান প্যারামিটার গ্রহণ করে এবং পরিবর্তন ছাড়াই এটি ফেরত দেয়।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

রিটার্ন টাইপ অবশ্যই প্যারামিটার হিসাবে একই জেনেরিক টাইপ টি হতে হবে।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম 2: জেনেরিক বক্স মোড়ক

ব্যায়াম#ts.m3.l2.e2
প্রচেষ্টা: 0লোড হচ্ছে...

বক্স নামের একটি জেনেরিক ইন্টারফেস সংজ্ঞায়িত করুন যা একটি টাইপ প্যারামিটার T গ্রহণ করে এবং T টাইপের বিষয়বস্তু নামে একটি একক সম্পত্তি রয়েছে।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

ইন্টারফেস বক্স ব্যবহার করুন<T> { বিষয়বস্তু: T; } বাক্য গঠন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম 3: সাধারণ সীমাবদ্ধতা

ব্যায়াম#ts.m3.l2.e3
প্রচেষ্টা: 0লোড হচ্ছে...

getLength নামে একটি জেনেরিক ফাংশন লিখুন যা একটি প্যারামিটার আর্গ গ্রহণ করে। arg অবশ্যই একটি ইন্টারফেসে সীমাবদ্ধ থাকতে হবে যার একটি দৈর্ঘ্য বৈশিষ্ট্য (সংখ্যা) রয়েছে। ফাংশনটি অবশ্যই arg.length প্রদান করবে।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

ফাংশনটিকে getLength<T extensed HasLength>(arg: T): সংখ্যা এবং রিটার্ন arg.length হিসাবে ঘোষণা করুন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম 4: জেনেরিক পেয়ার

ব্যায়াম#ts.m3.l2.e4
প্রচেষ্টা: 0লোড হচ্ছে...

দুটি বৈশিষ্ট্য সহ একটি জেনেরিক ইন্টারফেস পেয়ার<T, U> সংজ্ঞায়িত করুন: প্রথমটি T টাইপ এবং U টাইপ দ্বিতীয়। এর পরে, একটি জেনেরিক ফাংশন makePair তৈরি করুন যা প্রথম (টাইপ T) এবং দ্বিতীয় (টাইপ U-এর) গ্রহণ করে এবং পেয়ার<T, U> বাস্তবায়নকারী একটি বস্তু প্রদান করে।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

দুটি জেনেরিক প্যারামিটার Pair<T, U> এর জন্য সিনট্যাক্স ব্যবহার করুন এবং সেই অনুযায়ী makePair সংজ্ঞায়িত করুন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ