Усовершенствование типизации функции, формирующей массив значений из объекта

Разрешите произвольные строковые ключи через Record<string, unknown> и возвращайте unknown[]. Для отсутствующего собственного поля добавляйте undefined; также исправьте имя вызова и скобки цикла.

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

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

Разрешите произвольные строковые ключи через Record<string, unknown> и возвращайте unknown[]. Для отсутствующего собственного поля добавляйте undefined; также исправьте имя вызова и скобки цикла.

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

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

Условие

Требуется доработать типизацию функции, которая собирает массив значений из переданного объекта по набору ключей. Функция должна корректно работать, даже если среди запрашиваемых ключей присутствуют отсутствующие в объекте, и не допускать ошибок компиляции в TypeScript.

const arrayFromkeys = (obj: Record<string, any>, keys: string[]) => { 
  const out = [];
  for (const key of keys) (
    out.push(obj[key]);
  )
  return out;
}
const obj = {
  a: 1, 
  b: 'B',
  'c d': null,
}

// Ошибка
arrayFronkeys(obj, ['z']);

Ответ

Разрешите произвольные строковые ключи через Record<string, unknown> и возвращайте unknown[]. Для отсутствующего собственного поля добавляйте undefined; также исправьте имя вызова и скобки цикла.

function arrayFromkeys(obj: Record<string, unknown>, keys: readonly string[]): unknown[] {
  const out: unknown[] = [];
  for (const key of keys) {
    out.push(Object.prototype.hasOwnProperty.call(obj, key) ? obj[key] : undefined);
  }
  return out;
}
arrayFromkeys(obj, ['z']); // [undefined]

unknown безопаснее any: потребитель должен сузить тип перед использованием значения. Здесь намеренно не используется keyof T, поскольку условие разрешает отсутствующие ключи. В исходнике опечатка arrayFronkeys и круглые скобки вместо тела for не связаны с типами и исправляются отдельно.

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

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

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

Подробнее