Смысл оператора ненулевого утверждения состоит в том, чтобы сообщить компилятору TypeScript, что вы уже знаете, что переменная не равна нулю.Рассмотрим следующий сценарий:
function fun1(node: SomeType | undefined) {
throwIfUndefined(node);
node!.fun2();
}
Вы вызываете функцию, которая, как вы знаете, выдает исключение, если node
не определено.Таким образом, действительно нет необходимости проверять, является ли узел неопределенным перед вызовом fun2
.Однако компилятор TypeScript не может вывести это, поэтому без восклицания он откажется компилировать ваш код, потому что думает, что вы не обрабатывали нулевой регистр.Но если вы, как программист, знаете, что такое условие никогда не произойдет, зачем вставлять избыточную проверку, которая будет стоить циклов ЦП в конечном продукте?Оператор ненулевого утверждения - это на самом деле просто способ сказать компилятору: «Да, я знаю, вы не можете сказать, что эта переменная не будет нулевой, но я так и делаю, убирайтесь с дороги».
Кроме того, какой смысл выдавать ошибку прямо перед кодом, который все равно выдает ошибку?Сообщение типа «Не пустое утверждение не удалось!»не более полезен, чем стандартное нулевое справочное сообщение.