Типобезопасный сбор значений свойства из массива объектов

Используйте generic T и ключ K extends keyof T; возвращаемый тип — T[K][]. Это связывает допустимое имя поля с типом каждого результата.

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

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

Используйте generic T и ключ K extends keyof T; возвращаемый тип — T[K][]. Это связывает допустимое имя поля с типом каждого результата.

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

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

Условие

Создайте функцию pluck, которая:

  • принимает массив объектов и имя свойства,
  • возвращает массив значений указанного свойства,
  • обладает строгой типизацией: передаваемый ключ обязан присутствовать в типе объекта, а тип возвращаемого массива соответствует типу значения этого свойства.
function pluck() {}

interface Person {
  name: string;
  age: number;
}

const people: Person[] = [
  { name: "Alice", age: 30 },
  { name: "Bob", age: 25 },
];

const names = pluck(people, "name"); // Ожидается string[] = ['Alice', 'Bob']
const ages = pluck(people, "age");   // Ожидается number[] = [30, 25]

Ответ

Используйте generic T и ключ K extends keyof T; возвращаемый тип — T[K][]. Это связывает допустимое имя поля с типом каждого результата.

function pluck<T, K extends keyof T>(items: readonly T[], key: K): T[K][] {
  return items.map(item => item[key]);
}

Для Person и name выводится string[], для age — number[]. Несуществующее поле вызовет ошибку компилятора. readonly во входном типе позволяет передавать и обычные, и неизменяемые массивы; функция создаёт новый массив. Если поле optional, undefined корректно останется в типе элементов результата.

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

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

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

Подробнее