Что такое оператор утверждения ненулевого типа?
В TypeScript оператор утверждения ненулевого типа (!) позволяет разработчикам сообщить компилятору, что значение
переменной не равно null или undefined, даже если TypeScript не может этого определить. Это полезно, когда
разработчик уверен в том, что переменная не будет пустой в момент использования.
Пример использования
Рассмотрим, как это работает на примере:
function getLength(str: string | null): number {
// Здесь компилятор не знает, что str не null.
return str.length; // Ошибка: 'str' может быть 'null'.
}
function getLengthSafe(str: string | null): number {
// Используем оператор утверждения ненулевого типа.
return str!.length; // Здесь мы уверены, что str не null и ошибок нет.
}
console.log(getLengthSafe("Hello, World!")); // Вывод: 13
Объяснение кода
- Функция
getLength: Принимает параметрstr, который может быть строкой илиnull. Когда мы пытаемся обратиться к свойствуlength, TypeScript выдает ошибку, так какstrможет быть равенnull. - Функция
getLengthSafe: Далее мы используем оператор!, чтобы сообщить системе типов, чтоstrне являетсяnullв этом месте. Теперь компилятор допускает доступ к свойствуlength, и код компилируется без ошибок.
Важные замечания
- Безопасность типов: Использование оператора утверждения ненулевого типа может привести к ошибкам времени
выполнения, если вы не уверены, что значение не будет
nullилиundefined. Используйте его с осторожностью. - Безопасные альтернативы: Вместо использования
!, рекомендуется всегда проверять значение перед его использованием:
function getLengthSafeWithCheck(str: string | null): number {
if (str === null) {
throw new Error("Строка не должна быть null!");
}
return str.length; // Теперь TypeScript знает, что str не null
}
Заключение
Оператор утверждения ненулевого типа — это мощный инструмент в TypeScript, который позволяет избежать избыточных
проверок на null или undefined, но его следует использовать с осторожностью. Правильное понимание и использование
этого оператора поможет вам писать более безопасный и эффективный код.