В некоторых ситуациях, мы хотим ограничить входной параметр функции типом «любой объект». Например, для функции, которая проверяет наличие ключей в объекте. Существует несколько способов сделать такую проверку и не все из них работают по тому, что ожидается. Посмотрите на пример:
// В качестве типа используется {}
function toString(obj: {}) {
return obj.toString();
}
toString('wow'); // Ok!
toString(123); // Ok!
toString({}); // Ok!
Пустой объектный тип {}
подразумевает под собой объект любой структуры и ограничивает множество всех значений, за исключением null
и undefined
. Пустой интерфейс работает так же как и пустой объектный тип. Это вряд ли то, что мы ожидали.
Тип Object
— это тип объекта. Он работает почти так же, как тип {}
. Разница только в том, что Object
предопределяет типы toString()
и некоторых других встроенных методов, а тип {}
этого не делает. Чтобы разобраться, изучим такой пример:
const foo: {} = {
toString() {
return 1; // Ok!
}
};
const bar: Object = {
toString() {
return 1; // Error!
}
};
Второе определение bar
не работает, потому что тип Object
указывает, что метод toString()
должен возвращать строку.
Если мы хотим работать с не примитивными значениями, то для этого существует еще один тип — object
с маленькой буквы:
function toString(obj: object) {
return obj.toString();
}
toString('wow'); // Error!
toString(123); // Error!
toString({}); // Ok!
При использовании типа object
попытка получить доступ к свойствам объекта приведет к ошибке. Для такой задачи используются уже другие механизмы.
В последующих уроках мы изучим подходы, такие как использование типа Record
и дженериков с keyof
для работы с объектами любой структуры. А пока вы можете использовать встроенные методы JavaScript, такие как Object.entries()
и Object.fromEntries()
, чтобы манипулировать объектами с типом object
.
Пример динамического извлечения ключей из объекта с использованием этих методов:
const extract = (obj: object, keys: Array<string>): object => {
const entries = Object.entries(obj).filter(([key]) => keys.includes(key));
return Object.fromEntries(entries);
};
- Метод
Object.entries(obj)
преобразует объект в массив пар [ключ, значение]. - Далее с помощью метода
filter()
мы оставляем только те пары, ключи которых содержатся в массивеkeys
. - Наконец,
Object.fromEntries(entries)
собирает новый объект из отфильтрованных пар.
Этот подход позволяет легко работать с объектами, фильтруя ключи на основе динамических данных, даже если используется тип object
, не предоставляющий доступ к свойствам напрямую.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.