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

টাইপ গার্ডস

টাইপ সংকীর্ণতা টাইপস্ক্রিপ্টের অন্যতম গুরুত্বপূর্ণ ধারণা। প্রায়শই, যদিও, typeof বা instanceof এর মতো স্ট্যান্ডার্ড টাইপ গার্ডগুলি জটিল কাস্টম অবজেক্টের জন্য যথেষ্ট নয়৷ এখানেই কাস্টম টাইপ গার্ড আসে।

স্ট্যান্ডার্ড টাইপ গার্ড

স্ট্যান্ডার্ড জাভাস্ক্রিপ্ট অপারেটর ব্যবহার করে টাইপস্ক্রিপ্ট কীভাবে প্রকারগুলিকে সংকুচিত করে তা সংক্ষিপ্ত করে শুরু করা যাক:

TS
function processInput(val: string | number) {
  if (typeof val === 'string') {
    // Here 'val' is of type string
    console.log(val.toUpperCase());
  } else {
    // Here 'val' is of type number
    console.log(val.toFixed(2));
  }
}

কাস্টম টাইপ গার্ড (is অপারেটর)

একটি কাস্টম টাইপ গার্ডকে সংজ্ঞায়িত করতে, আমরা একটি ফাংশন তৈরি করি যা একটি স্ট্যান্ডার্ড বুলিয়ান রিটার্ন টাইপের পরিবর্তে parameterName is Type ফরম্যাটে একটি টাইপ প্রিডিকেট প্রদান করে।

ফাংশনটি অবশ্যই একটি বুলিয়ান (true বা false) প্রদান করবে। যদি এটি true রিটার্ন করে, TypeScript জানতে পারবে যে পাস করা প্যারামিটারটি নির্দিষ্ট ধরনের।

TS
interface Cat {
  name: string;
  meow(): void;
}

interface Dog {
  name: string;
  bark(): void;
}

// This is a custom type guard
function isCat(animal: Cat | Dog): animal is Cat {
  return (animal as Cat).meow !== undefined;
}

function makeNoise(pet: Cat | Dog) {
  if (isCat(pet)) {
    // Here TypeScript knows 'pet' is a Cat
    pet.meow();
  } else {
    // Here TypeScript knows 'pet' is a Dog
    pet.bark();
  }
}

নিরাপত্তা এবং কাস্টিং (as বনাম টাইপ গার্ড)

টাইপ কাস্টিং (যেমন, val as Cat) কোনো বাস্তব রানটাইম যাচাই ছাড়াই কম্পাইলারকে ডেভেলপারকে বিশ্বাস করতে বাধ্য করে। যদি রানটাইম অবজেক্টটি প্রত্যাশা পূরণ না করে, কোডটি নীরবে ব্যর্থ হবে বা ব্যতিক্রমগুলি নিক্ষেপ করবে।

কাস্টম টাইপ গার্ড, অন্যদিকে, একটি শক্তিশালী এবং গতিশীল রানটাইম পরীক্ষা করে, নিরাপদে এবং সঠিকভাবে টাইপস্ক্রিপ্ট কম্পাইলারকে প্রকৃত পরিবর্তনশীল প্রকার সম্পর্কে অবহিত করে:

TS
function processInput(input: unknown) {
  // unsafe casting: could crash if input does not have the split method
  // const str = input as string;
  // console.log(str.split(' '));

  // safe guard
  if (isString(input)) {
    console.log(input.split(' ')); // 100% Safe!
  }
}

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

ব্যায়াম 1: স্ট্রিং টাইপ গার্ড

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

isString নামে একটি সাধারণ ফাংশন তৈরি করুন যা একটি অজানা মান একটি স্ট্রিং কিনা তা যাচাই করতে একটি কাস্টম টাইপ গার্ড হিসাবে কাজ করে।

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

ফাংশনের রিটার্ন টাইপ অবশ্যই val is স্ট্রিং হতে হবে এবং এটি 'স্ট্রিং' এর সমান কিনা তা পরীক্ষা করতে আপনার typeof ব্যবহার করা উচিত।

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

ব্যায়াম 2: প্রিমিয়াম ইউজার টাইপ গার্ড

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

ব্যবহারকারী এবং প্রিমিয়াম ব্যবহারকারীর ধরন প্রদত্ত, একটি টাইপ গার্ড ফাংশন লিখুন isPremiumUser(user: User): ব্যবহারকারী হল PremiumUser যে ব্যবহারকারীর 'প্রিমিয়াম' ভূমিকা আছে কিনা তা পরীক্ষা করে।

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

স্বাক্ষরটিকে ফাংশন হিসাবে সংজ্ঞায়িত করুন isPremiumUser(user: User): ব্যবহারকারী হল PremiumUser এবং user.role কে 'প্রিমিয়াম'-এর সাথে তুলনা করুন।

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

অনুশীলনী 3: কাস্টম ত্রুটি বস্তুর বৈধতা

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

isCustomError(err: unknown): err হল CustomError ফাংশন যা যাচাই করে যে একটি অজানা মান একটি নন-নাল CustomError অবজেক্ট যাতে 'কোড' কী থাকে।

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

প্রথমে পরীক্ষা করুন যে টাইপফের ত্রুটিটি 'অবজেক্ট' এবং শূন্য নয়, তারপর 'কোড' বৈশিষ্ট্য পরীক্ষা করতে 'ইন' অপারেটর ব্যবহার করুন।

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

ব্যায়াম 4: অ্যাডমিন টাইপ গার্ড

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

ব্যবহারকারী (প্রপার্টি রোল সহ: স্ট্রিং) এবং অ্যাডমিন (ব্যবহারকারীকে প্রসারিত করা এবং একটি প্রপার্টি অ্যাডমিন টোকেন: স্ট্রিং) দুটি ইন্টারফেস দেওয়া হয়েছে, isAdmin নামে একটি টাইপ গার্ড ফাংশন লিখুন যা ব্যবহারকারী টাইপ ব্যবহারকারীকে গ্রহণ করে এবং একটি টাইপ প্রিডিকেট ব্যবহারকারীকে অ্যাডমিন প্রদান করে। ব্যবহারকারীর ভূমিকা 'অ্যাডমিন'-এর সমান কিনা গার্ডকে অবশ্যই পরীক্ষা করতে হবে।

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

ফাংশন isAdmin(user: User): user is Admin এবং user.role === 'admin' কিনা চেক করুন।

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