یہ دونوں operators آپ کو موجودہ types اور values سے types اخذ کرنے دیتے ہیں — جو type-level programming کی بنیاد ہے۔
keyof — کسی object type کی keys کا union
ts
interface User { id: number; name: string; }
type = keyof ;
یہ دونوں operators آپ کو موجودہ types اور values سے types اخذ کرنے دیتے ہیں — جو type-level programming کی بنیاد ہے۔
interface User { id: number; name: string; }
type = keyof ;
const config = { host: "localhost", port: 3000 };
type Config = typeof config; // { host: string; port: number }
typeof (type position میں) کسی runtime value کی inferred type حاصل کر لیتا ہے، تاکہ آپ کو type الگ سے لکھنے کی ضرورت نہ پڑے۔
function getProp<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const user = { id: 1, name: "Ann" };
getProp(user, "name"); // returns string
getProp(user, "age"); // ❌ Error: "age" is not a key of user
یہاں K extends keyof T key کو حقیقی keys تک محدود کرتا ہے، اور T[K] (ایک indexed access type) اُس key کے لیے بالکل درست value type واپس دیتا ہے۔ ٹائپنگ کی غلطیاں compile errors بن جاتی ہیں۔
const Roles = { Admin: "admin", User: "user" } as const;
type Role = typeof Roles[keyof typeof Roles]; // "admin" | "user"
keyof اور typeof value کی دنیا اور type کی دنیا کو جوڑتے ہیں۔
یہ type-safe property access کو ممکن بناتے ہیں، config/constants سے types اخذ کرتے ہیں (single source of truth)، اور mapped اور conditional types کے بنیادی اجزاء ہیں۔
انہی کی بدولت آپ متوازی type definitions کو ہاتھ سے برقرار رکھنے سے بچتے ہیں۔