Разрешите произвольные строковые ключи через 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 не связаны с типами и исправляются отдельно.