> Что такое keyof в TypeScript и для чего он используется (TypeScript)

Уровень: junior · Роль: frontend · Категория: Технические вопросы

Компании: Иннотех, Soft_Media_Group, Altenar

Стек: TypeScript

> Пример ответа

Короткий ответ

keyof - это оператор TypeScript, который возвращает объединение (union) всех ключей (имён свойств) заданного типа. Он используется для создания типобезопасных функций, ограничения параметров ключами объекта, работы с mapped types и обеспечения строгой типизации при доступе к свойствам.

Подробное объяснение

keyof работает как оператор, который берёт существующий тип и извлекает из него все ключи в виде строкового или числового литерального union типа. Например, для интерфейса { name: string; age: number } keyof вернёт 'name' | 'age'. Это позволяет TypeScript проверять корректность имён свойств на этапе компиляции.

Основные сценарии использования:

  • Создание обобщённых функций для доступа к свойствам объекта
  • Реализация типобезопасных getter/setter
  • Построение mapped types (например, Partial<T>, Readonly<T>)
  • Ограничение параметров в generic-функциях
  • Работа с enum и строковыми литералами

keyof особенно полезен при работе с динамическими ключами, когда нужно гарантировать, что переданное имя свойства действительно существует в объекте.

На практике

В реальных проектах keyof часто применяется для:

  • Функций валидации форм, где ключи должны соответствовать полям модели
  • Создания универсальных утилит для работы с API (например, сортировка по полю)
  • Реализации паттерна "строитель" с типобезопасными цепочками вызовов
  • Типизации конфигурационных объектов с динамическими ключами

Пример кода

TYPESCRIPT
interface User {
id: number;
name: string;
email: string;
age: number;
}
// Функция для безопасного доступа к свойству
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const user: User = { id: 1, name: 'Alice', email: 'alice@example.com', age: 30 };
// Корректное использование
const userName = getProperty(user, 'name'); // тип string
const userAge = getProperty(user, 'age'); // тип number
// Ошибка компиляции: 'salary' не существует в User
// getProperty(user, 'salary');
// Использование с mapped types
type Optional<T> = {
[K in keyof T]?: T[K];
};
type PartialUser = Optional<User>;
// { id?: number; name?: string; email?: string; age?: number }

Как отвечать на собеседовании

Начни с простого определения: "keyof - это оператор, который возвращает union всех ключей типа". Затем приведи пример использования в generic-функции. Объясни, что это помогает избежать ошибок с несуществующими ключами. Упомяни связь с mapped types и покажи понимание, как это используется во встроенных утилитах TypeScript (Partial, Pick, Record).

Что проверяет интервьюер

  • Понимание системы типов TypeScript и работы с union types
  • Умение применять keyof в практических сценариях
  • Знание mapped types и их связи с keyof
  • Способность объяснить, как keyof повышает типобезопасность
  • Понимание разницы между keyof и простым перечислением ключей

Типичные ошибки

  • Путать keyof с typeof (typeof получает тип значения, keyof - ключи типа)
  • Использовать keyof с примитивными типами (для string вернёт string | number, что может быть неочевидно)
  • Забывать, что keyof работает только с типами, а не с значениями
  • Не учитывать, что для массивов keyof возвращает ключи массива (length, push, pop и т.д.), а не индексы
  • Пытаться использовать keyof с интерфейсами, содержащими index signature (ключи будут string или number)

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью