Что такое keyof в TypeScript и для чего он используется
Что проверяют
Понимаете ли вы, что это оператор над типами, и знаете ли типовое применение.
Как отвечать
Оператор возвращает объединение имён свойств типа.
type User = { id: number; name: string; email: string };
type UserKey = keyof User; // "id" | "name" | "email"Главное применение это типобезопасный доступ к свойству. Функция принимает объект и имя поля, а тип результата зависит от того, какое поле запросили:
function get<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const name = get(user, "name"); // string
const id = get(user, "id"); // number
get(user, "phone"); // ошибка на этапе компиляцииЗдесь работают три вещи вместе: ограничение допустимых ключей, индексный доступ к типу и вывод конкретного типа результата. Без этого функция возвращала бы объединение всех типов полей, и вызывающему пришлось бы приводить тип вручную.
Где это встречается на практике:
- сортировка и фильтрация по имени поля: имя проверяется компилятором, опечатка не пройдёт;
- описание колонок таблицы, где ключ данных связан с типом строки;
- формы: имя поля и тип значения согласованы.
На этом же операторе построены встроенные вспомогательные типы: выбор подмножества свойств, исключение свойств, тип словаря с заданным набором ключей. Понимание оператора сразу объясняет, как они устроены.
Полезное дополнение: в связке с оператором получения типа значения он позволяет вывести тип из обычного объекта, а не наоборот. Это популярный приём, заменяющий перечисления: объявляется объект с константами, а тип получается из него автоматически.
Где спотыкаются
Путают оператор над типом и перебор ключей во время выполнения.
Не ограничивают параметр и получают объединение всех типов полей.
Не знают, что на нём построены стандартные вспомогательные типы.
Пишут строковые имена полей без типизации и ловят опечатки в рантайме.