Дана функция и два объекта для проверки типов. В одном случае TypeScript не ругается, в другом — ругается. Нужно типизировать функцию так, чтобы поведение TypeScript соответствовало ожидаемому (используя generics и keyof).

Чтобы типизировать функцию getProperty так, чтобы:

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

Что ответить на собеседовании

Чтобы типизировать функцию getProperty так, чтобы:

Подробный разбор

Ответ с пояснениями

Чтобы типизировать функцию getProperty так, чтобы:

  • Первый аргумент был объектом (не примитивом и не функцией),
  • Второй аргумент был ключом этого объекта,
  • Возвращаемое значение соответствовало типу свойства по ключу,

можно использовать условные типы и ограничения в TypeScript.

Пример типизации:

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

Здесь:

  • T extends object гарантирует, что obj — объект,
  • K extends keyof T гарантирует, что key — ключ объекта T,
  • Возвращаемый тип T[K] соответствует типу значения по ключу.

Таким образом, вызовы:

getProperty(X, 'a'); // OK
getProperty(X, 'e'); // Ошибка, 'e' нет в ключах X
getProperty({ name: 'Sergey' }, 'name'); // OK
getProperty(1, 1); // Ошибка, 1 не объект

Это обеспечивает строгую типизацию и предотвращает ошибки на этапе компиляции.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее