Как использовать оператор Keyof для объекта?
Объекты и прототипы
Оператор `keyof` применяют к объектному типу, чтобы получить union его ключей — для типобезопасного доступа к свойствам через дженерики и indexed access.
keyof — union ключей типа
interface User {
id: number;
name: string;
email: string;
}
type UserKeys = keyof User; // 'id' | 'name' | 'email'Применение к объекту через typeof
Для конкретного объекта (значения) сначала typeof, потом keyof:
const config = { host: 'localhost', port: 3000 };
type ConfigKey = keyof typeof config; // 'host' | 'port'Типобезопасный доступ к свойству
function getProp<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const user: User = { id: 1, name: 'Ann', email: 'a@b.com' };
getProp(user, 'name'); // тип string (T[K])
getProp(user, 'age'); // ошибка компиляции — нет такого ключаK extends keyof T— ключ должен быть свойством объекта.T[K]— indexed access type (тип значения по ключу).
С mapped types
type Optional<T> = { [K in keyof T]?: T[K] };
type Readonly<T> = { readonly [K in keyof T]: T[K] };Практика
- Типобезопасный
get/setпо ключу. - Итерация по ключам с типизацией.
- Утилитные типы (
Pick,Omitпостроены на keyof).
Коротко для собеседования
keyof применяют к типу для получения union ключей (keyof User → 'id'|'name'|'email'); к объекту-значению — через keyof typeof obj. Основное применение — типобезопасный доступ к свойству: function get<T, K extends keyof T>(obj: T, key: K): T[K]. С mapped types строят утилитные типы (Pick, Omit, Partial).