টাইপস্ক্রিপ্টে ইউটিলিটি টাইপ

টাইপস্ক্রিপ্টে ইউটিলিটি টাইপ

এই প্রবন্ধটি টাইপস্ক্রিপ্টে ইউটিলিটি টাইপগুলি ব্যাখ্যা করে।

YouTube Video

টাইপস্ক্রিপ্টে ইউটিলিটি টাইপ

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

Partial<T>

Partial<T> একটি অবজেক্ট টাইপের সমস্ত প্রপার্টি ঐচ্ছিক করে তোলে (যা undefined অনুমোদন করে)। আপনি যখন মূল টাইপের কিছু নির্দিষ্ট প্রপার্টি ব্যবহার করতে চান তখন এটি উপকারী।

 1interface User {
 2  id: number;
 3  name: string;
 4  age: number;
 5}
 6
 7function updateUser(user: Partial<User>) {
 8  console.log(user);
 9}
10
11updateUser({ name: "Alice" }); // Updates only 'name'

ব্যাখ্যা:

উপরের উদাহরণে, Partial<User> ব্যবহার করে User টাইপের সমস্ত প্রপার্টি ঐচ্ছিক করা হয়েছে। সুতরাং, updateUser ফাংশনটিতে আপনি শুধুমাত্র প্রপার্টির একটি উপসেট পাস করতে পারবেন।

Required<T>

Required<T> সমস্ত প্রপার্টিগুলিকে, ঐচ্ছিকগুলি সহ, প্রয়োজনীয় করে তোলে। আপনি যখন ঐচ্ছিক প্রপার্টিগুলিকে প্রয়োজনীয়তে রূপান্তর করতে চান তখন এটি ব্যবহৃত হয়।

 1interface User {
 2  id: number;
 3  name?: string;
 4  age?: number;
 5}
 6
 7function createUser(user: Required<User>) {
 8  console.log(user);
 9}
10
11// createUser({ id: 1 }); // Error: 'name' and 'age' are required
12createUser({ id: 1, name: "Alice", age: 25 });

ব্যাখ্যা:

Required<User> ব্যবহার করে, name এবং age এর মতো প্রপার্টিগুলিকে প্রয়োজনীয় হিসাবে গণ্য করা হয়।

Readonly<T>

Readonly<T> একটি অবজেক্টের সমস্ত প্রপার্টিকে শুধুমাত্র পাঠযোগ্য করে তোলে। এটি অবজেক্টের মান পরিবর্তন হওয়া রোধ করে।

 1interface User {
 2  id: number;
 3  name: string;
 4}
 5
 6const user: Readonly<User> = {
 7  id: 1,
 8  name: "Alice"
 9};
10
11// user.id = 2; // Error: 'id' is read-only
12console.log(user);

ব্যাখ্যা:

Readonly<T> ব্যবহার করে, আপনি একটি অবজেক্টের প্রপার্টিগুলিকে পরিবর্তিত হওয়া থেকে রক্ষা করতে পারেন। আপনার যখন ডেভেলপমেন্টের সময় ডেটা অনিচ্ছাকৃতভাবে সংশোধন হওয়া রোধ করতে চান তখন এটি কার্যকর।

Record<K, T>

Record<K, T> নির্দিষ্ট কী এবং ভ্যালু টাইপের একটি মানচিত্র টাইপ তৈরি করে। K কীগুলির জন্য টাইপ (যেমন string বা number), এবং T মানগুলির জন্য টাইপ।

 1type Roles = "admin" | "user" | "guest";
 2interface Permissions {
 3  read: boolean;
 4  write: boolean;
 5}
 6
 7const rolePermissions: Record<Roles, Permissions> = {
 8  admin: { read: true, write: true },
 9  user: { read: true, write: false },
10  guest: { read: false, write: false },
11};
12
13console.log(rolePermissions);

ব্যাখ্যা:

Record<K, T> তখন উপকারী যখন আপনি কী-ভ্যালু জোড়া সংজ্ঞায়িত করতে চান। উপরের উদাহরণে, ব্যবহারকারী ভূমিকার উপর ভিত্তি করে অনুমতিগুলি সংজ্ঞায়িত করা হয়েছে।

Pick<T, K>

Pick<T, K> একটি অবজেক্ট টাইপ থেকে শুধুমাত্র নির্দিষ্ট প্রপার্টিগুলি বের করে। আপনি শুধুমাত্র প্রয়োজনীয় প্রপার্টিগুলি বের করে একটি নতুন টাইপ তৈরি করতে পারেন।

 1interface User {
 2  id: number;
 3  name: string;
 4  age: number;
 5}
 6
 7type UserSummary = Pick<User, "id" | "name">;
 8
 9const summary: UserSummary = {
10  id: 1,
11  name: "Alice"
12};
13
14console.log(summary);

ব্যাখ্যা:

Pick<T, K> ব্যবহার করে আপনি একটি অবজেক্ট টাইপ থেকে নির্দিষ্ট প্রপার্টিগুলিকে বের করে নতুন টাইপ হিসাবে বিবেচনা করতে পারেন। উদাহরণস্বরূপ, উপরোক্ত উদাহরণে শুধুমাত্র id এবং name বের করা হয়েছে।

Omit<T, K>

Omit<T, K> একটি অবজেক্ট টাইপ থেকে নির্দিষ্ট প্রপার্টিগুলো বাদ দেয়। এটি Pick এর বিপরীত কার্যসম্পাদনা।

 1interface User {
 2  id: number;
 3  name: string;
 4  age: number;
 5  email: string;
 6}
 7
 8type UserWithoutEmail = Omit<User, "email">;
 9
10const userWithoutEmail: UserWithoutEmail = {
11  id: 1,
12  name: "Alice",
13  age: 25
14};
15
16console.log(userWithoutEmail);

ব্যাখ্যা:

Omit<T, K> ব্যবহার করে নির্দিষ্ট প্রপার্টিগুলো বাদ দিয়ে একটি নতুন টাইপ তৈরি করা যায়। উপরে উদাহরণে, email প্রপার্টি বাদ দেওয়া হয়েছে।

Exclude<T, U>

Exclude<T, U> টাইপ T থেকে টাইপ U সরিয়ে একটি নতুন টাইপ তৈরি করে। একটি নির্দিষ্ট টাইপ বাদ দিতে হলে এটি ব্যবহার করা হয়।

1type Status = "active" | "inactive" | "pending";
2type ExcludedStatus = Exclude<Status, "pending">;
3
4const status: ExcludedStatus = "active"; // "pending" is excluded, so it cannot be chosen
5console.log(status);

ব্যাখ্যা:

Exclude<T, U> ব্যবহার করে, একটি ইউনিয়ন টাইপ থেকে অপ্রয়োজনীয় টাইপগুলো সরিয়ে ফেলা যায়। উপরে উদাহরণে, যেহেতু "pending" বাদ দেওয়া হয়েছে, তাই শুধুমাত্র "active" অথবা "inactive" বেছে নেওয়া যেতে পারে।

Extract<T, U>

Extract<T, U> ইউনিয়ন টাইপ T এর মধ্যে টাইপ U এর সাথে মিল রয়েছে এমন অংশগুলো বের করে। কেবল একটি নির্দিষ্ট টাইপ বের করতে হলে এটি খুব কার্যকর।

1type Status = "active" | "inactive" | "pending";
2type ActiveStatus = Extract<Status, "active" | "pending">;
3
4const status: ActiveStatus = "active"; // "inactive" cannot be chosen
5console.log(status);

ব্যাখ্যা:

Extract<T, U> Exclude এর বিপরীত কার্য সম্পন্ন করে। উপরে উদাহরণে, শুধুমাত্র "active" এবং "pending" বেছে নেওয়া যেতে পারে।

NonNullable<T>

NonNullable<T> টাইপ থেকে null এবং undefined বাদ দিয়ে একটি নতুন টাইপ তৈরি করে। ঐচ্ছিক টাইপ থেকে এই মানগুলো বাদ দিতে হলে এটি সহায়ক।

1type UserName = string | null | undefined;
2type ValidUserName = NonNullable<UserName>;
3
4const name: ValidUserName = "Alice"; // null and undefined cannot be chosen
5console.log(name);

ব্যাখ্যা:

NonNullable<T> একটি টাইপ থেকে null এবং undefined বাদ দেয়। যখন নিশ্চয়তা দিতে চান যে একটি মান অবশ্যই রয়েছে, তখন এটি অত্যন্ত কার্যকর।

উপসংহার

টাইপস্ক্রিপ্টের ইউটিলিটি টাইপগুলো টাইপ ডিফিনিশনগুলোকে আরও সংক্ষিপ্ত এবং নমনীয় করতে শক্তিশালী সরঞ্জাম। Partial, Required, Readonly, Record ইত্যাদির মতো মৌলিক ইউটিলিটি টাইপগুলো বুঝে এবং সঠিকভাবে ব্যবহার করে কোড পুনঃব্যবহারযোগ্যতা এবং রক্ষণাবেক্ষণ আরও উন্নত করা যায়। এই টাইপগুলো আয়ত্ত করার মাধ্যমে আরও মজবুত এবং নিরাপদ টাইপ ডিফিনিশন তৈরি করা সম্ভব হয়, যা কার্যকর উন্নয়ন সক্ষম করে।

TypeScript-এর keyof অপারেটর

TypeScript-এর keyof অপারেটরটি একটি অবজেক্ট টাইপের সব প্রপার্টি নাম রিট্রিভ করতে ব্যবহৃত হয়। এই অপারেটরটি ব্যবহার করে, আপনি একটি অবজেক্ট টাইপের সমস্ত কী-গুলি ইউনিয়ন টাইপ হিসেবে পেতে পারেন। টাইপ-সেফ কোড লেখার জন্য এটি অত্যন্ত উপকারী।

প্রাথমিক ব্যবহার

1interface Person {
2    name: string;
3    age: number;
4    email: string;
5}
6
7// Use keyof to get the property names of Person
8type PersonKeys = keyof Person; // "name" | "age" | "email"

উদাহরণ ব্যবহার

  1. ফাংশনের আর্গুমেন্টগুলিতে এটি ব্যবহার করা

    আপনি keyof ব্যবহার করে এমন একটি ফাংশন সংজ্ঞায়িত করতে পারেন যার টাইপগুলি একটি অবজেক্টের নির্দিষ্ট প্রোপার্টিগুলির উপর ভিত্তি করে।

1function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
2    return obj[key];
3}
4
5const person: Person = { name: "Alice", age: 30, email: "alice@example.com" };
6const name = getProperty(person, "name"); // type is string
7const age = getProperty(person, "age");   // type is number
  1. টাইপ সীমাবদ্ধতাগুলিকে উন্নত করা

    keyof ব্যবহার করে, আপনি নিশ্চিত করতে পারেন যে একটি ফাংশনে পাঠানো কী-গুলি কম্পাইল সময়ে যাচাই করা হয়।

1// Passing an invalid property name results in an error
2const invalid = getProperty(person, "invalidKey"); // Error

সারসংক্ষেপ

  • keyof অপারেটরটি একটি অবজেক্ট টাইপের সমস্ত প্রোপার্টি নামগুলি পুনরুদ্ধার করতে ব্যবহৃত হয়।
  • আপনি প্রোপার্টি নামগুলি ইউনিয়ন টাইপ হিসেবে পেতে পারেন, টাইপ-সেফ কোড অর্জন করতে।
  • ফাংশনের আর্গুমেন্টগুলিতে এটি ব্যবহার করে, আপনি ফাংশনটিকে কেবল বৈধ প্রোপার্টি নাম গ্রহণ করতে সীমিত করতে পারেন।

এইভাবে, keyof অপারেটরটি TypeScript-এ টাইপ সুরক্ষা উন্নত করে এবং আপনাকে আরও মজবুত কোড লেখার জন্য সহায়তা করে।

আপনি আমাদের ইউটিউব চ্যানেলে ভিজ্যুয়াল স্টুডিও কোড ব্যবহার করে উপরের নিবন্ধটি অনুসরণ করতে পারেন। দয়া করে ইউটিউব চ্যানেলটিও দেখুন।

YouTube Video