Оператор утверждения ненулевого значения
Используйте оператор !, чтобы утверждать, что значение не равно 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 — локальная установка не требуется.
Все уроки этого курса
- Ключевое слово as для утверждений типов
- Оператор утверждения ненулевого значения
- Двойные утверждения и их риски
- Утверждения и проверки типов