> Что такое 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 (например, сортировка по полю)
- Реализации паттерна "строитель" с типобезопасными цепочками вызовов
- Типизации конфигурационных объектов с динамическими ключами
Пример кода
TYPESCRIPTinterface 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'); // тип stringconst userAge = getProperty(user, 'age'); // тип number// Ошибка компиляции: 'salary' не существует в User// getProperty(user, 'salary');// Использование с mapped typestype 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)
> Похожие задачи по frontend
Что такое объединение и пересечение типов в TypeScript
Что такое декораторы в TypeScript и для чего они используются
Что такое generics в TypeScript и как они помогают создавать переиспользуемые компоненты?
Что такое операторы Pick, Partial, Omit, Required, NonNullable и Exclude в TypeScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью