Как проверить на наличие и `null`, и `undefined`?
Поскольку TypeScript является строго типизированным языком, использование конструкции if () {} для проверки на null и undefined выглядит неправильно.
Существует ли в TypeScript какая-либо специализированная функция или синтаксический сахар для этой проверки?
5 ответ(ов)
Вы можете использовать "джагглинг-проверку" для того, чтобы одновременно протестировать на null и undefined:
if (x == null) {
Если вы используете строгую проверку, это будет истинно только для значений, установленных в null, и не сработает для переменных, не имеющих значения (undefined):
if (x === null) {
Вы можете протестировать это с различными значениями, используя следующий пример:
var a: number;
var b: number = null;
function check(x, name) {
if (x == null) {
console.log(name + ' == null');
}
if (x === null) {
console.log(name + ' === null');
}
if (typeof x === 'undefined') {
console.log(name + ' is undefined');
}
}
check(a, 'a');
check(b, 'b');
Вывод будет таким:
"a == null"
"a is undefined"
"b == null"
"b === null"
Таким образом, вы можете видеть, как check(a, 'a') сработает только для undefined и null, тогда как check(b, 'b') сработает для обеих проверок, а также покажет, что b строго равно null.
В TypeScript условие if( value ) { } будет оцениваться как true, если value не равен:
nullundefinedNaN- пустой строке
'' 0false
Важно отметить, что TypeScript включает правила JavaScript, поэтому поведение этих проверок будет одинаковым в обоих языках.
TypeScript полностью поддерживает JavaScript-выражение something == null. Это выражение корректно исключает как null, так и undefined при проверке.
Дополнительная информация
ПРОСТОЙ ОТВЕТ
Хотя TypeScript — это строго типизированный язык, он унаследовал те же проблемы с указателями и инициализацией переменных от JavaScript.
JavaScript не проверяет, существует ли переменная в контексте, что приводит к распространенному состоянию undefined.
Чтобы проверить, что значение НЕ является null, undefined, 0, false, "" или NaN:
if (value)
или
if ( !!value )
Для отрицательного условия проверьте, является ли значение null, undefined, 0, false, "" или NaN:
if ( !value )
Чтобы проверить, является ли значение null или undefined:
if ( value == null )
Чтобы проверить только на null:
if ( value === null )
Чтобы проверить только на undefined:
if ( value === undefined )
ПОДРОБНЫЙ ОТВЕТ
1- Это выражение будет оцениваться как true, если значение не равно: null, undefined, NaN, пустая строка '', 0, false.
Если значение равно null, undefined, NaN, пустой строке, 0 или false, то управление перейдет к условию else.
if ( value ) {
console.log('значение отличается от 0, "", false, NaN, null, undefined');
} else {
console.log('значение равно 0, "", false, NaN, null или undefined');
}
if ( !!value ) {
console.log('значение отличается от 0, "", false, NaN, null, undefined');
} else {
console.log('значение равно 0, "", false, NaN, null или undefined');
}
2- Если вам нужно отрицательное условие, вам нужно использовать:
if ( !value ) {
console.log('значение равно 0, "", false, NaN, null или undefined');
} else {
console.log('значение отличается от 0, "", false, NaN, null, undefined');
}
3- Это выражение будет проверять, является ли значение null или undefined:
if ( value == null ) {
console.log('это null или undefined');
} else {
console.log('это не null и не undefined');
}
4- Использовать тест с логическими значениями не сработает.
Выражение НЕ будет оцениваться как true, так и false, если значение равно null, undefined, 0, пустой строке, или NaN.
Обе проверки всегда перейдут в условие else.
За исключением случая, если значение является логической переменной.
if ( value==true ) {
} else {
}
if ( value==false ) {
} else {
}
Давайте разберем ваш код и результат его выполнения.
Вы провели тесты в playground TypeScript, где объявили переменные a, b и c. Сначала у вас переменная a не инициализирована, переменная b равна null, а переменная c — пустая строка.
Вот что вы получили в выводе:
a is null or undefined
b is null or undefined
c is defined
На основании этого результата можно сделать несколько выводов:
Проверка
if (a == null)— это правильный способ узнать, является лиaравнымnullилиundefined. В данном случаеaне инициализирована, и проверка возвращаетtrue.Проверка
if (b == null)— это также верный способ определить, является лиbравнымnullилиundefined. Посколькуbинициализирована какnull, условие также выполнится.Проверка
if (c == null)— это ложное срабатывание, так какc— это пустая строка, она не равна ниnull, ниundefined.Проверка
if (a != null)— корректный метод для проверки, определена ли переменнаяa. Результат проверки будетfalse, так какaне инициализирована.Проверка
if (b != null)— возвращаетfalse, потому чтоbравноnull.Проверка
if (c != null)— возвращаетtrue, посколькуcинициализирована как пустая строка.Проверка
if (a)— это неверный способ проверки, существует ли переменнаяa. Посколькуaне инициализирована, условие не выполнится и будет проигнорировано.Проверка
if (b)— также вернетfalse, так какbравнаnull.Проверка
if (c)— вернетtrue, как и ожидалось, потому что пустая строка считается "правдой" в контексте либо проверки на истинность, либо проверок в логических условиях.
В итоге ваши выводы можно резюмировать следующим образом:
- Для определения, является ли переменная
nullилиundefined, можно использовать== null. - Для определения, что переменная определена, правильнее использовать
!= null. - Проверка
if (a)не подходит для этой цели, если переменная не инициализирована, поскольку возвращаетfalseдляundefinedиnull, но может дать неожиданные результаты для других "ложных" значений, таких как пустая строка или0.
Это важно учитывать, когда вы разрабатываете код.
'unknown' против 'any': в чем разница?
Разница между "require(x)" и "import x"
@Directive против @Component в Angular
ESLint: 8.0.0 Не удалось загрузить плагин '@typescript-eslint'
Как создать заглушку для интерфейса / определения типа в TypeScript?