логотип PurpleSchool
Иконка входа
Вход
логотип PurpleSchool

Null и Undefined в TypeScript

Автор

Дмитрий Нечаев

Введение

В JavaScript есть два примитивных значения, используемых для сигнализации об отсутствии или неинициализированном значении: null и undefined.

В TypeScript есть два соответствующих типа с такими же именами. Поведение этих типов зависит от того, включена ли у вас опция strictNullChecks.

Выключенный strictNullChecks

При отключенной strictNullChecks, к значениям, которые могут быть нулевыми или неопределенными, по-прежнему можно обращаться нормально, а значения null и undefined могут быть присвоены свойству любого типа. Это похоже на то, как ведут себя языки без проверки нуля (например, C#, Java). Отсутствие проверки этих значений, как правило, является основным источником ошибок; мы всегда рекомендуем включать strictNullChecks, если это целесообразно в их кодовой базе.

Включенный strictNullChecks

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

function doSomething(x: string | null) {
  if (x === null) {
    // ничего не делай
  } else {
    console.log("Привет, " + x.toUpperCase());
  }
}

Оператор утверждения non-null (Postfix !)

В TypeScript также есть специальный синтаксис для удаления null и undefined из типа без явной проверки. Запись ! после любого выражения фактически является утверждением типа, что значение не является null или undefined:

function liveDangerously(x?: number | null) {
  // Нет ошибки
  console.log(x!.toFixed());
}

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

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile