Простые типы

Объявление переменной с определенным типом

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

const a: number = 10;

Это очень похоже на то, как объявляется переменная в JavaScript:

const a = 10;

Только добавляется описание типа переменной. Делается это при помощи двоеточия (:) и названия типа (number). Если попытаться присвоить переменной с типом number значение другого типа (например, строки), TypeScript выдаст ошибку во время компиляции:

const a: number = "it's a string"; //Error: Type '"it's a string"' is not assignable to type 'number'.(2322)

number, string и boolean

Рассмотри следующие два примитивных типа: 1. string - позволяет присваивать любую строку 2. boolean - позволяет присваивать любое логическое значение (true или false)

const a: number = 10;
const b: string = "it's a string";
const c: boolean = true;

По аналогии с примером для number, если мы попытаемся присвоить значение, которое не совместимо с типом, компилятор TypeScript выдаст ошибку.

Массивы

Существует несколько способов, как указать на то, что мы хотим записывать в переменную массив каких-то значений. Первый способ -использовать постфикс [] после объявления типа элементов массива.

Второй способ - использовать интерфейс Array и передать ему в качестве generic-параметра тип элементов.

Что такое интерфейс и generic-параметры мы рассмотрим позже. Сейчас важно понимать, что тип для массива можно объявить двумя разными способами и что эти два способа эквивалентны.

Мы в основном будем пользоваться первым способом.

Все описанные правила для массива применимы не только для number, но и для других типов (например, рассмотренные нами string и boolean).

Рассмотрим несколько важных особенностей массивов:

  1. Если хотя бы один элемент присваиваемого массива не соответствует типу элементов массива, то TypeScript выдаст ошибку во время компиляции.

  2. Присвоить пустой массив можно любому типу-массиву.

  3. Тип-массив, помимо ограничений на типы элементов этого массива, также определят свойство length. Свойство length имеет тип number и хранит количество элементов в этом массиве.

Кортеж (Tuple)

Кортеж - это особый вид массива. Он позволяет строго задать количество элементов массива, а также тип каждого элемента. Например.

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

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

null и undefined

Без дополнительных настроек значения null и undefined можно присваивать переменным любого типа.

Однако, можно типизировать переменные типами null и undefined. Таким переменным можно присваивать только два этих типа (почти, но об это в следующей серии).

Автоматический вывод типов

В TypeScript любой литерал имеет тип. Например

TypeScript автоматически определят тип литерала. При использовании оператора присваивания (=) TypeScirpt проверяет соответствие типа правого и левого операнда. Если типы не совместимы, то возникает ошибка компиляции.

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

У механизма автоматического вывода типов есть ряд особенностей. Одна из таких особенностей - различие между массивом и кортежем. Дело в том, что выражение [1, 2, 3] имеет тип number[], а не [number, number, number]. Соответственно автоматический вывод типов присвоит левой части тип number[]. Если мы хотим, чтобы переменная слева была кортежем - нужно явно указывать тип.

Однако обратная операция всегда выполнима - значение с типом [number, number] всегда можно присвоить в переменную с типом number[].

P.S.

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

Задания

Last updated

Was this helpful?