Skip to Content

🧠 কী হলো keyof?

TypeScript-এ keyof হলো একটি type operator যা কোনো object টাইপের key গুলিকে union টাইপে রূপান্তর করে।

এটি প্রায়ই generic constraint এর সঙ্গে ব্যবহার করা হয় যেন আমরা object-এর key/value নিয়ে টাইপ-সেফ উপায়ে কাজ করতে পারি।

📘 keyof অপারেটরের মাধ্যমে জেনেরিক কনস্ট্রেইন্ট

🚗 একটি উদাহরণ দিয়ে শুরু করি

আমরা একটি vehicle টাইপ বানিয়েছি যেখানে তিনটি ভেহিকেল টাইপ আছে—সবগুলোই স্ট্রিং:

type Vehicle = { bike: string; car: string; ship: string; };

🧍 কাউকে আমরা ভেহিকেলগুলোর মালিক বানাতে চাই

একজন ব্যক্তি তিনটি ভেহিকেল টাইপের মধ্যে যেকোনো একটি ভেহিকেল-এর মালিক হতে পারে। যদি ম্যানুয়ালি করি, তাহলে এমন হবে:

type Owner1 = 'bike' | 'car' | 'ship'; // ম্যানুয়ালি বানানো

keyof ব্যবহার করে আরও সহজভাবে করা যায়

type Owner2 = keyof Vehicle; // 'bike' | 'car' | 'ship'

এখানে আমরা ম্যানুয়ালি না করে সরাসরি Vehicle টাইপ-এর key গুলো দিয়ে টাইপ বানিয়ে ফেলেছি।এইভাবে keyof ব্যবহার করলে future-proof টাইপ বানানো যায় — Vehicle টাইপে যদি আরও কিছু যুক্ত হয়, তাহলে Owner2-তেও অটো যুক্ত হবে।

const person1: Owner1 = 'ship'; const person2: Owner2 = 'ship';

🔁 দুই ভাবেই করা যায়, কিন্তু keyof ব্যবহারে কোডটা অনেক বেশি ডাইনামিক ও স্কেলেবল হয়। ভবিষ্যতে যদি Vehicle টাইপে নতুন কী যোগ হয়, তাহলে Owner2 নিজে থেকেই আপডেট হয়ে যাবে।


💡

📚 বাস্তব উদাহরণ: অবজেক্ট থেকে ভ্যালু পাওয়া

ধরি আমাদের একটি ইউজার অবজেক্ট আছে:

const user = { name: 'Mr', age: 25, address: 'ctg' }; user['name']; // key দিয়ে value পাওয়া যাচ্ছে

আমরা চাই একটি জেনেরিক ফাংশন বানাতে যা যেকোনো অবজেক্টের property value রিটার্ন করবে।

❌ ভুল উপায় – টাইপ নিরাপত্তা নেই

const getProperty = (obj: string, key: string) => { return obj[key]; // এখানে ভুল হবে };

এইভাবে টাইপ দিলে TypeScript কোন validation দিচ্ছে না—যেকোনো ভুল key দিলেও চলবে।

❌ একটু উন্নত কিন্তু এখনও সমস্যা

const getProperty = <X, Y>(obj: X, key: Y) => { return obj[key]; // এখনও TypeScript বলবে: 'Y' টাইপটি 'X' টাইপের index না };

✅ ঠিক উপায় – keyof দিয়ে constraint বসানো

const getProperty = <X, Y extends keyof X>(obj: X, key: Y): X[Y] => { return obj[key]; };

এখানে আমরা Y টাইপকে X এর keyof অর্থাৎ key গুলোর মধ্যে সীমাবদ্ধ করে দিয়েছি। এখন TypeScript বুঝতে পারবে যে key অবশ্যই obj এর বৈধ key হতে হবে।

✅ ব্যবহার:

const result1 = getProperty(user, 'name'); // 'Mr'

✅ Bonus: এখন আমরা যেকোনো object এই ফাংশনে পাঠাতে পারি

const car = { model: "BMW", }; const userName = getProperty(user, "name"); // ✅ OK const carModel = getProperty(car, "model"); // ✅ OK const errorTry = getProperty(car, "color"); // ❌ Error: 'color' does not exist

👉 এইভাবে keyof এবং Generic Constraint ব্যবহার করে আমাদের কোড হয় আরও শক্তিশালী, টাইপ-সেফ এবং maintainable। ✅ উপসংহার:

বিষয়বর্ণনা
keyofকোনো object টাইপের key গুলিকে union টাইপে রূপ দেয়
ব্যবহারটাইপ পুনর্ব্যবহারযোগ্য ও টাইপ-সেফ রাখতে
Generic ConstraintK extends keyof T — key গুলো object টাইপের মধ্যে আছে কিনা validate করে
লাভটাইপ-সেফ কোড, ভুল ধরতে পারা, future-proof টাইপ, কম কোড
Last updated on