0Pricing
TypeScript Academy · Урок

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

Используйте оператор !, чтобы утверждать, что значение не равно null или undefined

«Оператор утверждения ненулевого значения» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

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

Постфиксный оператор ! сообщает TypeScript: «в этом месте значение не равно null или undefined». Он удаляет эти варианты из типа без какой-либо проверки во время выполнения.

function firstChar(s: string | null): string {
  return s!.charAt(0); // assert s is not null
}
console.log(firstChar('hello'));

Где ставить !

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

type Box = { value?: number };
const box: Box = { value: 7 };
const n: number = box.value!; // value is number | undefined -> number
console.log(n);

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

Иногда Вы логически убедились, что значение существует, но компилятор не может проследить это рассуждение. Оператор ! позволяет продолжить работу. Однако настоящая проверка во время выполнения обычно понятнее.

const list: Array<string | null> = ['a', null, 'c'];
const present = list.filter((x) => x !== null);
// TS may still see string | null; assert if certain:
console.log(present[0]!.toUpperCase());

Снова только этап компиляции

Как и as, оператор ! удаляется во время выполнения. Он не выполняет никаких проверок. Если значение действительно равно null, во время выполнения произойдёт ошибка, хотя компилятор и считает код корректным.

function risky(s: string | null): number {
  return s!.length; // no runtime guard
}
console.log(risky('hi'));
// risky(null) would throw at runtime

Опасность оператора !

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

type User = { name?: string };
const u: User = {};
// const len = u.name!.length; // compiles, crashes at runtime
console.log('name is undefined here -> ! would crash');

Предпочитайте настоящую проверку

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

type User = { name?: string };
function nameLen(u: User): number {
  if (u.name) return u.name.length; // checked
  return 0;
}
console.log(nameLen({ name: 'Ada' }), nameLen({}));

Утверждение гарантированной инициализации

Связанная возможность — утверждение гарантированной инициализации: let x!: T. Оно обещает компилятору, что переменной x присвоят значение до использования, даже если при объявлении она не инициализируется.

let token!: string; // promise: assigned before use
function init() { token = 'abc123'; }
init();
console.log(token.length);

Гарантированная инициализация в классах

Это часто используется в классах, где свойство задаётся фреймворком или методом инициализации, а не конструктором. Символ ! после имени свойства подавляет ошибку «свойству не присвоено значение с гарантией».

class Service {
  config!: { url: string }; // set later by setup()
  setup() { this.config = { url: '/api' }; }
}
const s = new Service();
s.setup();
console.log(s.config.url);

Используйте гарантированную инициализацию осторожно

Утверждение гарантированной инициализации — ещё одно обещание, которое компилятор не может проверить. Если обратиться к свойству до присваивания, во время выполнения Вы получите значение undefined без предупреждения.

class Late {
  data!: number[];
  read() { return this.data.length; } // crashes if called before init
}
const l = new Late();
l.data = [1, 2];
console.log(l.read());

! и необязательная цепочка вызовов

Не используйте !, когда достаточно ?.. Необязательная цепочка вызовов безопасно обрабатывает null во время выполнения, а ! лишь отключает предупреждение компилятора. Эти операторы решают разные задачи.

type Cfg = { db?: { host?: string } };
const c: Cfg = {};
console.log(c.db?.host ?? 'localhost'); // safe
// c.db!.host! would crash here

Когда оператор ! оправдан

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

const cache = new Map<string, number>();
cache.set('hits', 0);
// We just set it, so get is non-null:
const hits = cache.get('hits')!;
console.log(hits);

Быстрая проверка

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

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

Вы узнали, что:

  • Постфикс ! удаляет null | undefined из типа только на этапе компиляции.
  • Он не выполняет проверку во время выполнения, поэтому ошибочное утверждение всё равно приводит к сбою.
  • let x!: T — это утверждение о обязательной инициализации для значений, которые инициализируются позже.
  • Предпочитайте настоящие проверки или опциональную цепочку; оставляйте ! для случаев, когда гарантия действительно есть.

Далее — двойные утверждения и связанные с ними риски.

const map = new Map<string, number>();
map.set('a', 1);
const v = map.get('a')!;
console.log(v);

Часто задаваемые вопросы

Урок «Оператор утверждения ненулевого значения» бесплатный?

Да — полный текст урока «Оператор утверждения ненулевого значения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Оператор утверждения ненулевого значения»?

Используйте оператор !, чтобы утверждать, что значение не равно null или undefined Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Оператор утверждения ненулевого значения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Ключевое слово as для утверждений типов
  2. Оператор утверждения ненулевого значения
  3. Двойные утверждения и их риски
  4. Утверждения и проверки типов
← Назад к TypeScript Academy