PassFront
  1. PassFront
  2. База знаний
  3. Объекты и прототипы

Как использовать оператор 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).

Другие вопросы раздела