🧠 কী হলো 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 Constraint | K extends keyof T — key গুলো object টাইপের মধ্যে আছে কিনা validate করে |
লাভ | টাইপ-সেফ কোড, ভুল ধরতে পারা, future-proof টাইপ, কম কোড |