Бесплатный курс по TypeScript. Зарегистрируйтесь для отслеживания прогресса →

TypeScript: Тип Any

В TypeScript добавлен специальный тип any, который используется там, где проверка типов не нужна, либо, когда TypeScript не может вывести тип данных автоматически.

// В таком случае тип будет any[],
// так как TypeScript не может вывести тип содержимого
// ведь его еще нет
const items = [];
// Можно добавлять все что угодно
items.push(1);
items.push('code-basics');

Использование any превращает TypeScript в JavaScript, так как данные с таким типом перестают проверяться.

// Ошибка возникает уже во время запуска кода
const value: any = 5;
value.toString(); // ok
value(); // ok
value.trim(); // ok
value = 'wow'; // ok

any полезен, например, при переводе проекта из JavaScript в TypeScript, когда сначала все типы объявляются как any, а затем понемногу переписываются на нужные.

Кроме того, он нужен для работы с библиотеками JavaScript (у которых нет описанных типов) из TypeScript кода. В остальных случаях any нужно избегать, так как теряется весь смысл использования языка TypeScript.

JavaScript => TypeScript

Возьмем для примера код, который считает количество слов в предложении:

const sentence = 'table cat table dog dog apple table';

const words = sentence.split(' ');
const initial = {};
const result = words.reduce((acc, word) => {
  acc[word] = Object.hasOwn(acc, word) ? acc[word] + 1 : 1;
  return acc;
}, initial);
// { table: 3, cat: 1, dog: 2, apple: 1 }

Компилятор TypeScript такой код не пропустит, он укажет на то, что объект, находящийся в константе initial, не содержит ключей со строковым типом.

No index signature with a parameter of type 'string' was found on type '{}'.
4 acc[word] = Object.hasOwn(acc, word) ? acc[word] + 1 : 1;

Почему так происходит? Структура объекта задает его тип во время определения и в процессе работы структура меняться не может. В коде же выше, изначально объект вообще пустой, а по мере работы он заполняется ключами динамически. Задавать правильно тип в ситуации с динамическими ключами мы научимся позже, а пока сделаем код рабочим с помощью any. Для этого нам надо определить объект с явным указанием типа:

const sentence = 'table cat table dog dog apple table';

const words = sentence.split(' ');
const initial: any = {}; // Указали тип как any
const result = words.reduce((acc, word) => {
  acc[word] = Object.hasOwn(acc, word) ? acc[word] + 1 : 1;
  return acc;
}, initial);

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

Задание

Реализуйте функцию getParams(), которая принимает на вход строку запроса (query string) и возвращает параметры в виде объекта

getParams('per=10&page=5');
// { per: '10', page: '5' }
getParams('name=hexlet&count=3&order=asc');
// { name: 'hexlet', count: '3', order: 'asc' }

Эту задачу лучше всего решать через метод reduce()

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе