TypeScript Null и Undefined

TypeScript обладает мощной системой для работы с null и undefined.

По умолчанию обработка null и undefined выключена, и её можно включить, установив параметр strictNullChecks в значение true.

Вся информация в этом разделе применима, когда strictNullChecks включён.


Типы null и undefined

null и undefined — это примитивные типы, которые можно использовать так же, как и другие типы, например, string. Они принимают одноименные значения null и undefined.

Пример


let value: string | undefined | null = null;
value = 'hello';
value = undefined;

Когда параметр strictNullChecks включен, TypeScript требует явно указывать undefined или null в типе, если значение может быть ими.


Необязательная цепочка

Необязательная цепочка — это особенность JavaScript, которая хорошо сочетается с обработкой null в TypeScript.

Она позволяет обращаться к свойству объекта, которое может существовать или нет, используя компактный синтаксис.

Для определения необязательной цепочки при обращении к свойству используется оператор ?..

Пример


interface House {
  sqft: number;
  yard?: {
    sqft: number;
  };
}

function printYardSize(house: House) {
  const yardSize = house.yard?.sqft;
  if (yardSize === undefined) {
    console.log('Нет двора');
  } else {
    console.log(`Размер двора: ${yardSize} квадратных футов`);
  }
}

let home: House = {
  sqft: 500
};

printYardSize(home); // Вывод: 'Нет двора'


Оператор нулевого объединения

Оператор нулевого объединения — это ещё одна особенность JavaScript, которая отлично работает с обработкой null в TypeScript.

Он позволяет писать выражения с резервным значением, которое вступает в силу только при возникновении null или undefined.

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

Для этого в выражениях используют оператор ??, аналогично оператору &&.

Пример


function printMileage(mileage: number | null | undefined) {
  console.log(`Пробег: ${mileage ?? 'Недоступно'}`);
}

printMileage(null); // Вывод: 'Пробег: Недоступно'
printMileage(0); // Вывод: 'Пробег: 0'


Оператор утверждения ненулевого значения

Система автоматического вывода типов TypeScript несовершенна, и иногда имеет смысл игнорировать возможность того, что значение может быть null или undefined.

Простой способ сделать это — использовать приведение/переопределение типов, но TypeScript также предоставляет оператор ! как удобное сокращение.

Пример


function getValue(): string | undefined {
  return 'hello';
}

let value = getValue();
console.log('Длина значения: ' + value!.length);

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


Обработка границ массива

Даже при включенном параметре strictNullChecks, по умолчанию TypeScript предполагает, что доступ к элементам массива никогда не вернёт undefined (если только undefined не является частью типа массива).

Параметр конфигурации noUncheckedIndexedAccess можно использовать для изменения этого поведения.

Пример


let array: number[] = [1, 2, 3];
let value = array[0]; // При включенном `noUncheckedIndexedAccess` тип будет `number | undefined`