Используйте 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 корректно останется в типе элементов результата.