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

TypeScript: Переменные

Переменные и константы в TypeScript определяются точно так же как и в JavaScript:

let age = 10;

let company = 'Hexlet';
let user = {
  firstName: 'Miro',
};
let fruits = ['apple', 'banana'];

Несмотря на внешнюю идентичность, TypeScript выполняет дополнительную работу на фоне. Он автоматически связывает переменную (или константу) с типом данных значения начального значения. В программировании такой процесс называется выводом типов.

Тип переменной поменяться не может:

let age = 10;
// Все нормально, тип тот же (Number)
age = 11.1;

// Type 'string' is not assignable to type 'number'.
age = 'some string'; // Error!

Если мы попытаемся передать эту переменную в метод, который ожидает другой тип, то это тоже приведет к ошибке:

// Argument of type 'number' is not assignable to parameter
// of type '(substring: string, ...args: any[])
'hexlet'.replace('xl', age);

Статическая типизация накладывает ограничение на массивы, внутри могут храниться данные только одного типа:

let items = [1, 2, 3];
items.push(4); // Все хорошо

// Argument of type 'string' is not assignable to parameter of type 'number'.
items.push('code-basics'); // Error!

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

let user = {
  firstName: 'Miro',
};

// Property 'lastName' does not exist on type '{ firstName: string; }'.
user.lastName = 'Smith';

Явное указание типа

Технически, TypeScript позволяет явно указывать тип переменных. Но на практике это редко нужно делать вручную, так как выводов типов работает автоматически.

let name: string = 'Alice';
const count: number = 100;
let canPlay: boolean = true;

Null

По умолчанию в TypeScript переменные могут содержать только указанный тип без исключений, например мы не можем присвоить null:

let age = 30;
age = null; // Error!

Такое поведение защищает нас от большого числа ошибок, связанных с отсутствием проверок на null. С другой стороны, иногда null является допустимым значением. В этом случае используется специальный Union Type:

let age: number | null = 30;
age = null;

Здесь мы указали, что тип у переменной age это number | null. Читается это как: "число или null". Union Type интересная и удобная концепция, которую мы рассмотрим подробнее позже.

Задание

Допишите тело функции repeat(), которая повторяет строку указанное количество раз без использования встроенных методов. Для такой реализации вам понадобится цикл.

repeat('hexlet', 2); // hexlethexlet
repeat('wo', 3); // wowowo
Упражнение не проходит проверку — что делать? 😶

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

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

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

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

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

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

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

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

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

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