Перейти к содержанию

Различия var, let, const и модификатора readonly при неявном указании примитивных типов

После того, как было рассмотрено понятие литеральных типов, и тем самым подведена черта под примитивными типами, наступило время рассмотреть особенности var, let и const определение которых не содержит явную аннотацию типа.

Нюансы на практике

Отсутствие аннотации типа у объявления переменной означает, что тип будет определен с помощью механизма вывода типов. В тот момент, когда var или let объявляется, но не инициализируется, вывод типов определяет их принадлежность к типу any. В случае с const невозможно обойтись без инициализации в момент объявления.

var a; // a: any
let b; // b: any
const c; // Error

Если при определении var или let аннотация типа была опущена, а присваемое значение принадлежит к примитивному типу, то вывод типа определит принадлежность на основе типа значения. Для цифр, это будет тип number, для строк string и т.д.

var a = 5; // a: number
let b = 'text'; // b: string

Но при аналогичной ситуации для const, вывод типов определит принадлежность не к типу значения, а к литеральному типу представляемого этим значением.

const a = 5; // a: 5
const b = 'text';
b: 'text';

Поведение вывода типов для поля объявленного с модификатором readonly аналогично объявлению const, то есть для примитивов будет выведен литеральный тип.

class T1 {
  readonly f1 = 'text'; // f1: text
  readonly f2 = 0; // f2: 0
  readonly f3 = true; // f3: true
}

Более подробно эта тема рассматривается далее в главе Вывод типов.