Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про TypeScript: typescript, keyof

Как сделать так, чтобы TypeScript ругался на несуществующий ключ объекта?

Вопрос проверяет умение заставить TypeScript строго контролировать доступ к свойствам объекта и предотвращать ошибки на этапе компиляции.

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

Чтобы TypeScript ругался на несуществующий ключ, нужно ограничить ключи через keyof и не использовать тип string или any. Если ключ типизирован как keyof T, компилятор разрешит доступ только к реально существующим свойствам объекта. Любая попытка передать невалидный ключ вызовет ошибку на этапе проверки типов. Это основной механизм типобезопасного доступа к объектам.

Длинный ответ

По умолчанию TypeScript может быть слишком «мягким», если дать ему слишком общий тип ключа.

Определение

keyof — оператор TypeScript, который формирует объединение всех допустимых ключей объекта.

Проблема без keyof

function get(obj: { a: number }, key: string) {
  return obj[key];
}

Что не так

  1. TypeScript не знает, существует ли такой ключ.

  2. Нет ошибки даже для get(obj, "b").

  3. Тип результата становится небезопасным (any или unknown).

Правильный подход с keyof

function get<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}

Поведение

const user = { id: 1, name: "Alex" };

get(user, "id");    // ok
get(user, "name");  // ok
get(user, "age");   // ошибка TypeScript

Использование с конкретным типом

type User = {
  id: number;
  name: string;
};

function getUserValue(user: User, key: keyof User) {
  return user[key];
}

Дополнительные меры строгости

  1. Включить noImplicitAny.

  2. Включить strict.

  3. Избегать индексных сигнатур без необходимости.

// ослабляет контроль
type Bad = {
  [key: string]: string;
};

Вывод

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

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • TypeScript

    TypeScript

Ключевые слова

#typescript

#keyof

Подпишись на React Developer в телеграм