Hai toán tử này cho phép bạn dẫn xuất type từ các type và giá trị hiện có — nền tảng của lập trình ở cấp độ type.
keyof — union các key của một object type
ts
interface User { id: number; name: string; }
type UserKey = keyof ;
const config = { host: "localhost", port: 3000 };
type Config = typeof config; // { host: string; port: number }
typeof (ở vị trí type) nắm bắt được type được suy ra của một giá trị runtime, nên bạn không phải viết type ra một cách riêng biệt.
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"); // trả về string
getProp(user, "age"); // ❌ Lỗi: "age" không phải là key của user
Ở đây K extends keyof T giới hạn key chỉ vào các key thực sự, và T[K] (một indexed access type) trả về chính xác kiểu giá trị cho key đó. Lỗi gõ nhầm trở thành lỗi biên dịch.
const Roles = { Admin: "admin", User: "user" } as const;
type Role = typeof Roles[keyof typeof Roles]; // "admin" | "user"
keyof và typeof kết nối thế giới giá trị và thế giới type.
Chúng hỗ trợ truy cập property type-safe, dẫn xuất type từ config/hằng số (một nguồn chân lý duy nhất - single source of truth), và là các khối xây dựng cho mapped type và conditional type.
Đó là cách bạn tránh phải duy trì thủ công các định nghĩa type song song.