Эти два оператора позволяют вам выводить типы из существующих типов и значений — основу программирования на уровне типов.
keyof — объединение ключей типа объекта
ts
interface User { id: number; name: string; }
type = keyof ;
Эти два оператора позволяют вам выводить типы из существующих типов и значений — основу программирования на уровне типов.
interface User { id: number; name: string; }
type = keyof ;
const config = { host: "localhost", port: 3000 };
type Config = typeof config; // { host: string; port: number }
typeof (в позиции типа) захватывает выведенный тип значения времени выполнения, чтобы вам не приходилось писать тип отдельно.
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 реальными ключами, а T[K] (тип индексированного доступа) возвращает точный тип значения для этого ключа. Опечатки становятся ошибками компиляции.
const Roles = { Admin: "admin", User: "user" } as const;
type Role = typeof Roles[keyof typeof Roles]; // "admin" | "user"
keyof и typeof соединяют мир значений и мир типов.
Они обеспечивают безопасный доступ к свойствам, вывод типов из конфигораций/констант (единственный источник истины) и являются строительными блоками для отображаемых и условных типов.
Это то, как вы избегаете ручного поддержания параллельных определений типов.