TypeScript বড় আকারের ওয়েব ডেভেলপমেন্টের জন্য শিল্পের মানদণ্ড হয়ে উঠেছে। বেশিরভাগ ডেভেলপার ইন্টারফেস এবং টাইপসের মৌলিক বিষয়গুলো জানলেও, আসল শক্তি এর অ্যাডভান্সড টাইপ সিস্টেমে। এখানে ৫টি প্যাটার্ন রয়েছে যা আপনাকে একজন সিনিয়র ইঞ্জিনিয়ার হিসেবে আলাদা করবে।
১. Generic Constraints
Generics শক্তিশালী, কিন্তু কখনো কখনো আপনাকে সীমিত করতে হয় কী পাস করা যেতে পারে। extends এখানে আপনার বন্ধু।
interface HasId { id: string; } function getById<T extends HasId>(list: T[], id: string): T | undefined { return list.find((item) => item.id === id); }
T যে HasId এক্সটেন্ড করে তা নিশ্চিত করে, আমরা গ্যারান্টি দিই যে ফাংশনের ভিতরে .id অ্যাক্সেস করা নিরাপদ।
২. Conditional Types
Conditional types আপনাকে অ-ইউনিফর্ম টাইপ ম্যাপিং তৈরি করতে দেয়। সিনট্যাক্সটি JavaScript-এর টার্নারি অপারেটরের মতো।
type IsString<T> = T extends string ? true : false; type A = IsString<string>; // true type B = IsString<number>; // false
একটি ব্যবহারিক উদাহরণ হলো union থেকে টাইপ ফিল্টার করা:
type Diff<T, U> = T extends U ? never : T; type NonNullable<T> = Diff<T, null | undefined>;
৩. Mapped Types
Mapped types আপনাকে প্রোপার্টি ট্রান্সফর্ম করে পুরানো টাইপের উপর ভিত্তি করে নতুন টাইপ তৈরি করতে দেয়।
type ReadOnly<T> = { readonly [P in keyof T]: T[P]; }; interface User { name: string; age: number; } type ReadOnlyUser = ReadOnly<User>;
আপনি মডিফায়ার যোগ বা অপসারণও করতে পারেন:
type Mutable<T> = { -readonly [P in keyof T]: T[P]; };
৪. Template Literal Types
TypeScript 4.1-এ প্রবর্তিত, এগুলো আপনাকে সরাসরি স্ট্রিং টাইপ ম্যানিপুলেট করতে দেয়।
type World = 'world'; type Greeting = `hello ${World}`; // "hello world" type Color = 'red' | 'blue'; type Quantity = 'light' | 'dark'; type Palette = `${Quantity}-${Color}`; // "light-red" | "light-blue" | "dark-red" | "dark-blue"
এটি নির্দিষ্ট প্যাটার্ন অনুসরণ করা স্ট্রিং টাইপ করার জন্য অবিশ্বাস্যভাবে কার্যকর, যেমন CSS ক্লাস বা ইভেন্ট নাম।
৫. infer কীওয়ার্ড
Conditional types-এর মধ্যে infer কীওয়ার্ড আপনাকে অন্য টাইপ থেকে টাইপ এক্সট্র্যাক্ট করতে দেয়।
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any; function check(): boolean { return true; } type CheckReturn = ReturnType<typeof check>; // boolean
এখানে, আমরা TypeScript-কে একটি ফাংশনের রিটার্ন টাইপ R "ইনফার" করতে এবং তা রিটার্ন করতে বলছি।
উপসংহার
এই প্যাটার্নগুলো আয়ত্ত করলে আপনি এমন লাইব্রেরি এবং ইউটিলিটি লিখতে পারবেন যা শক্তিশালী এবং চমৎকার ডেভেলপার অভিজ্ঞতা (DX) প্রদান করে। অ্যাডভান্সড TypeScript-এর লক্ষ্য জটিলতার জন্য জটিলতা নয়, বরং নিরাপত্তা এবং প্রকাশক্ষমতা।