Поскольку TypeScript строго типизирован, простое использование if () {}
для проверки null
и undefined
звучит неправильно.
Есть ли в TypeScript какая-либо специальная функция или синтаксический сахар для этого?
Поскольку TypeScript строго типизирован, простое использование if () {}
для проверки null
и undefined
звучит неправильно.
Есть ли в TypeScript какая-либо специальная функция или синтаксический сахар для этого?
Используя проверку жонглирования, вы можете протестировать как null
, так и undefined
за один удар:
if (x == null) {
Если вы используете строгую проверку, она будет верна только для значений, установленных на null
, и не будет оцениваться как истинная для неопределенных переменных:
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');
Выход
"а == ноль"
"а не определено"
"b == null"
"b === null"
"false" == false
непустая строка, такая как false, оценивается как true
.
- person Fenton; 01.08.2016
if(x)
, но не if(x == null)
, который улавливает только null
и undefined
. Проверьте это с помощью var c: number = 0; check(c, 'b');
, это не nully, null
или undefined
.
- person Fenton; 09.08.2017
if (!x)
будет рассматривать (например) число 0
и строку ''
как ноль, тогда как if (x == null)
- нет.
- person Fenton; 04.11.2017
if ( x!= null)
эквивалентно if (!(x != null))
?
- person Mark Meuer; 13.03.2018
if( value ) {
}
будет оцениваться как true
, если value
не равно:
null
undefined
NaN
''
0
false
Машинопись включает правила javascript.
В TypeScript 3.7 теперь есть Необязательное связывание и Нулевое объединение для проверки null и undefined strong > заодно пример:
let x = foo?.bar.baz();
этот код проверит, определен ли foo, иначе он вернет undefined
старый способ:
if(foo != null && foo != undefined) {
x = foo.bar.baz();
}
это:
let x = (foo === null || foo === undefined) ? undefined : foo.bar();
if (foo && foo.bar && foo.bar.baz) { // ... }
С необязательной цепочкой будет:
let x = foo?.bar();
if (foo?.bar?.baz) { // ... }
еще одна новая функция - Нулевое слияние, например:
let x = foo ?? bar(); // return foo if it's not null or undefined otherwise calculate bar
старый способ:
let x = (foo !== null && foo !== undefined) ?
foo :
bar();
if
stmt, такого как if (context != null) word.ctx = context;
, все равно придется прибегать к старой проверке жонглирования, как описано в одобренном комментарии stackoverflow.com/a/28984306/407986
- person dVaffection; 28.10.2020
Optional chaining
, например if (foo?.bar?.baz)
typescriptlang.org/docs/handbook/release-notes /
- person hien; 08.01.2021
Есть ли в TypeScript специальная функция или синтаксический сахар для этого?
TypeScript полностью понимает версию JavaScript something == null
.
TypeScript правильно исключит как null
, так и undefined
с помощью таких проверок.
https://basarat.gitbook.io/typescript/recap/null-undefined
myVar == null
. Еще один вариант.
- person David Sherret; 11.03.2015
== null
- это правильный способ проверки на null и undefined. !!something
- бесполезное принуждение в условном выражении в JS (просто используйте something
). !!something
также приведет к принуждению 0 и '' к false, чего вы не хотите делать, если ищете null / undefined.
- person C Snover; 11.03.2015
Я делал разные тесты на машинописной площадке:
http://www.typescriptlang.org/play/
let a;
let b = null;
let c = "";
var output = "";
if (a == null) output += "a is null or undefined\n";
if (b == null) output += "b is null or undefined\n";
if (c == null) output += "c is null or undefined\n";
if (a != null) output += "a is defined\n";
if (b != null) output += "b is defined\n";
if (c != null) output += "c is defined\n";
if (a) output += "a is defined (2nd method)\n";
if (b) output += "b is defined (2nd method)\n";
if (c) output += "c is defined (2nd method)\n";
console.log(output);
дает:
a is null or undefined
b is null or undefined
c is defined
so:
Я думаю, что этот ответ нуждается в обновлении, проверьте историю изменений для старого ответа.
По сути, у вас есть три различных случая: null, undefined и undeclared, см. Фрагмент ниже.
// bad-file.ts
console.log(message)
Вы получите сообщение об ошибке, в котором говорится, что переменная message
не определена (также известна как необъявленная), конечно, компилятор Typescript не должен позволять вам этого делать, но ДЕЙСТВИТЕЛЬНО ничто не может вам помешать.
// evil-file.ts
// @ts-gnore
console.log(message)
Компилятор будет счастлив просто скомпилировать приведенный выше код. Итак, если вы уверены, что все переменные объявлены, вы можете просто сделать это
if ( message != null ) {
// do something with the message
}
приведенный выше код будет проверять null
и undefined
, НО в случае, если переменная message
может быть необъявленной (в целях безопасности), вы можете рассмотреть следующий код
if ( typeof(message) !== 'undefined' && message !== null ) {
// message variable is more than safe to be used.
}
Примечание: порядок здесь typeof(message) !== 'undefined' && message !== null
очень важен, вы должны сначала проверить состояние undefined
, иначе он будет таким же, как message != null
, спасибо @Jaider.
typeof sth !== 'undefined' && sth !== null
. Поскольку тесты выполняются слева направо, у меня была ошибка с неопределенным sth
для теста sth !== null
- person Al-un; 17.01.2019
if(typeof something !== 'undefined' && something !== null){...}
- person Jaider; 10.07.2019
Вы можете попробовать
if(!!someValue)
с !!
.
Объяснение
Первый !
превратит ваше выражение в значение boolean
.
Тогда !someValue
равно true
, если someValue
является ложным, и false
, если someValue
правдивым. Это может сбивать с толку.
При добавлении еще одного !
выражение теперь будет true
, если someValue
правдиво, и false
, если someValue
является ложным, с чем намного легче справиться.
Обсуждение
Зачем мне беспокоить if (!!someValue)
, если что-то вроде if (someValue)
дало бы мне такой же результат?
Потому что !!someValue
- это именно логическое выражение, тогда как someValue
может быть абсолютно любым. Такое выражение теперь позволит писать функции (а они нам нужны) вроде:
isSomeValueDefined(): boolean {
return !!someValue
}
вместо того:
isSomeValueDefined(): boolean {
if(someValue) {
return true
}
return false
}
Я надеюсь, что это помогает.
!!'false'
на деле true
, потому что 'false'
- допустимая строка
- person avi.elkharrat; 12.02.2019
Для Typescript 2.x.x
вы должны сделать это следующим образом (используя введите охранник):
tl; dr
function isDefined<T>(value: T | undefined | null): value is T {
return <T>value !== undefined && <T>value !== null;
}
Почему?
Таким образом isDefined()
будет учитывать тип переменной, и следующий код будет знать, что эта проверка будет учтена.
Пример 1 - базовая проверка:
function getFoo(foo: string): void {
//
}
function getBar(bar: string| undefined) {
getFoo(bar); //ERROR: "bar" can be undefined
if (isDefined(bar)) {
getFoo(bar); // Ok now, typescript knows that "bar' is defined
}
}
Пример 2 - проявляет уважение:
function getFoo(foo: string): void {
//
}
function getBar(bar: number | undefined) {
getFoo(bar); // ERROR: "number | undefined" is not assignable to "string"
if (isDefined(bar)) {
getFoo(bar); // ERROR: "number" is not assignable to "string", but it's ok - we know it's number
}
}
if(data){}
это значит! данные
true
или false
. Если у вас есть логическое значение с присваиванием null
или значением undefined
, в обоих случаях значение будет оцениваться как false
.
- person KBeDev; 19.05.2020
ОБНОВЛЕНИЕ (4 сентября 2020 г.)
Теперь вы можете использовать оператор ??
для проверки значений null
и undefined
и установки значения по умолчанию. Например:
const foo = null;
const bar = foo ?? 'exampleValue';
console.log(bar); // This will print 'exampleValue' due to the value condition of the foo constant, in this case, a null value
В качестве подробного способа, если вы хотите сравнить значения null и undefined ТОЛЬКО, используйте следующий пример кода для справки:
const incomingValue : string = undefined;
const somethingToCompare : string = incomingValue; // If the line above is not declared, TypeScript will return an excepion
if (somethingToCompare == (undefined || null)) {
console.log(`Incoming value is: ${somethingToCompare}`);
}
Если incomingValue
не объявлен, TypeScript должен вернуть исключение. Если это объявлено, но не определено, console.log()
вернет Входящее значение: undefined. Обратите внимание, что мы не используем оператор строгого равенства.
Правильный способ (подробности см. В других ответах), если incomingValue
не является типом boolean
, просто оцените, истинно ли его значение, это будет оцениваться в соответствии с типом константы / переменной. Строка true
должна быть явно определена как строка с использованием присваивания = ''
. В противном случае он будет оценен как false
. Давайте проверим этот случай, используя тот же контекст:
const incomingValue : string = undefined;
const somethingToCompare0 : string = 'Trumpet';
const somethingToCompare1 : string = incomingValue;
if (somethingToCompare0) {
console.log(`somethingToCompare0 is: ${somethingToCompare0}`); // Will return "somethingToCompare0 is: Trumpet"
}
// Now, we will evaluate the second constant
if (somethingToCompare1) {
console.log(`somethingToCompare1 is: ${somethingToCompare1}`); // Launched if incomingValue is defined
} else {
console.log(`somethingToCompare1 is: ${somethingToCompare1}`); // Launched if incomingValue is undefined. Will return "somethingToCompare1 is: undefined"
}
a == (b || c)
- это не то же самое, что и a == b || a == c
, вместо этого он будет оценивать b || c
(в данном случае c
, поскольку b
является ложным в вашем примере), а затем сравнивает это с a
.
- person CherryDT; 07.11.2020
Если вы используете TypeScript, лучше позволить компилятору проверять значения NULL и undefined (или их возможность), а не проверять их во время выполнения. (Если вы действительно хотите проверить во время выполнения, то, как указано во многих ответах, просто используйте value == null
).
Используйте параметр компиляции strictNullChecks
, чтобы сообщить компилятору подавиться возможными нулевыми или неопределенными значениями. Если вы установите этот параметр, а затем возникнет ситуация, когда вы действительно хотите разрешить null и undefined, вы можете определить тип как Type | null | undefined
.
Если вы хотите передать tslint
без установки strict-boolean-expressions
на allow-null-union
или allow-undefined-union
, вам нужно использовать isNullOrUndefined
из модуля util
node
или свернуть свой собственный:
// tslint:disable:no-null-keyword
export const isNullOrUndefined =
<T>(obj: T | null | undefined): obj is null | undefined => {
return typeof obj === "undefined" || obj === null;
};
// tslint:enable:no-null-keyword
Не совсем синтаксический сахар, но полезно, когда ваши правила tslint строгие.
Самый простой способ - использовать:
import { isNullOrUndefined } from 'util';
и тогда:
if (!isNullOrUndefined(foo))
value === null || value === undefined
.
- person Aleksei; 04.06.2021
Поздно присоединяться к этой теме, но я нахожу этот JavaScript-хакер очень удобным для проверки того, не определено ли значение.
if(typeof(something) === 'undefined'){
// Yes this is undefined
}
Может быть, слишком поздно! но вы можете использовать оператор ??
в машинописном тексте. см. https://mariusschulz.com/blog/nullish-coalescing-the-operator-in-typescript
вы можете использовать
if(x === undefined)
Все,
Ответ, набравший наибольшее количество голосов, на самом деле не работает, если вы работаете с объектом. В том случае, если свойство отсутствует, проверка не пройдет. И это было проблемой в нашем случае: см. Этот образец:
var x =
{ name: "Homer", LastName: "Simpson" };
var y =
{ name: "Marge"} ;
var z =
{ name: "Bart" , LastName: undefined} ;
var a =
{ name: "Lisa" , LastName: ""} ;
var hasLastNameX = x.LastName != null;
var hasLastNameY = y.LastName != null;
var hasLastNameZ = z.LastName != null;
var hasLastNameA = a.LastName != null;
alert (hasLastNameX + ' ' + hasLastNameY + ' ' + hasLastNameZ + ' ' + hasLastNameA);
var hasLastNameXX = x.LastName !== null;
var hasLastNameYY = y.LastName !== null;
var hasLastNameZZ = z.LastName !== null;
var hasLastNameAA = a.LastName !== null;
alert (hasLastNameXX + ' ' + hasLastNameYY + ' ' + hasLastNameZZ + ' ' + hasLastNameAA);
Исход:
true , false, false , true (in case of !=)
true , true, true, true (in case of !==) => so in this sample not the correct answer
Ссылка plunkr: https://plnkr.co/edit/BJpVHD95FhKlpHp1skUE
null
. Попробуйте следующее: plnkr.co/edit/NfiVnQNes1p8PvXd1fCG?p=preview
- person simonhamp; 09.11.2017
Более быстрое и короткое обозначение для null
проверок может быть:
value == null ? "UNDEFINED" : value
Эта строка эквивалентна:
if(value == null) {
console.log("UNDEFINED")
} else {
console.log(value)
}
Особенно, когда у вас много null
проверок, это хорошая короткая запись.
У меня была эта проблема, и некоторые ответы отлично работают для JS
, но не для TS
, вот в чем причина.
//JS
let couldBeNullOrUndefined;
if(couldBeNullOrUndefined == null) {
console.log('null OR undefined', couldBeNullOrUndefined);
} else {
console.log('Has some value', couldBeNullOrUndefined);
}
Это все хорошо, поскольку в JS нет типов.
//TS
let couldBeNullOrUndefined?: string | null; // THIS NEEDS TO BE TYPED AS undefined || null || Type(string)
if(couldBeNullOrUndefined === null) { // TS should always use strict-check
console.log('null OR undefined', couldBeNullOrUndefined);
} else {
console.log('Has some value', couldBeNullOrUndefined);
}
В TS, если переменная не была определена с помощью null
, когда вы пытаетесь проверить это null
, tslint
| компилятор будет жаловаться.
//tslint.json
...
"triple-equals":[true],
...
let couldBeNullOrUndefined?: string; // to fix it add | null
Types of property 'couldBeNullOrUndefined' are incompatible.
Type 'string | null' is not assignable to type 'string | undefined'.
Type 'null' is not assignable to type 'string | undefined'.
осторожно, если вы используете локальное хранилище, вы можете получить строку undefined, а не значение undefined:
localStorage.setItem('mykey',JSON.stringify(undefined));
localStorage.getItem('mykey') === "undefined"
true
Люди могут найти это полезным: https://github.com/angular/components/blob/master/src/cdk/coercion/boolean-property.spec.ts
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
/** Coerces a data-bound value (typically a string) to a boolean. */
export function coerceBooleanProperty(value: any): boolean {
return value != null && `${value}` !== 'false';
}
import {coerceBooleanProperty} from './boolean-property';
describe('coerceBooleanProperty', () => {
it('should coerce undefined to false', () => {
expect(coerceBooleanProperty(undefined)).toBe(false);
});
it('should coerce null to false', () => {
expect(coerceBooleanProperty(null)).toBe(false);
});
it('should coerce the empty string to true', () => {
expect(coerceBooleanProperty('')).toBe(true);
});
it('should coerce zero to true', () => {
expect(coerceBooleanProperty(0)).toBe(true);
});
it('should coerce the string "false" to false', () => {
expect(coerceBooleanProperty('false')).toBe(false);
});
it('should coerce the boolean false to false', () => {
expect(coerceBooleanProperty(false)).toBe(false);
});
it('should coerce the boolean true to true', () => {
expect(coerceBooleanProperty(true)).toBe(true);
});
it('should coerce the string "true" to true', () => {
expect(coerceBooleanProperty('true')).toBe(true);
});
it('should coerce an arbitrary string to true', () => {
expect(coerceBooleanProperty('pink')).toBe(true);
});
it('should coerce an object to true', () => {
expect(coerceBooleanProperty({})).toBe(true);
});
it('should coerce an array to true', () => {
expect(coerceBooleanProperty([])).toBe(true);
});
});
Поскольку TypeScript - это типизированный надмножество ES6 JavaScript. А lodash - это библиотека javascript.
Использование lodash для проверки, является ли значение нулевым или неопределенным, может быть выполнено с помощью _.isNil()
.
_.isNil(value)
значение (*): значение для проверки.
(логическое): возвращает истину, если значение равно нулю, иначе - ложь.
_.isNil(null);
// => true
_.isNil(void 0);
// => true
_.isNil(NaN);
// => false
Мы используем помощник hasValue
, который проверяет значения NULL / undefined и гарантирует с помощью TypeScript, что ненужные проверки не выполняются. (Последнее похоже на то, как TS будет жаловаться на if ("a" === undefined)
, поскольку это всегда ложь).
Последовательное использование этого всегда безопасно, в отличие от !val
, которое соответствует пустым строкам, нулю и т. Д. Оно также позволяет избежать использования нечеткого ==
сопоставления, что почти всегда является плохой практикой - нет необходимости вводить исключение.
type NullPart<T> = T & (null | undefined);
// Ensures unnecessary checks aren't performed - only a valid call if
// value could be nullable *and* could be non-nullable
type MustBeAmbiguouslyNullable<T> = NullPart<T> extends never
? never
: NonNullable<T> extends never
? never
: T;
export function hasValue<T>(
value: MustBeAmbiguouslyNullable<T>,
): value is NonNullable<MustBeAmbiguouslyNullable<T>> {
return (value as unknown) !== undefined && (value as unknown) !== null;
}
export function hasValueFn<T, A>(
value: MustBeAmbiguouslyNullable<T>,
thenFn: (value: NonNullable<T>) => A,
): A | undefined {
// Undefined matches .? syntax result
return hasValue(value) ? thenFn(value) : undefined;
}
Я всегда пишу так:
var foo:string;
if(!foo){
foo="something";
}
Это будет работать нормально, и я думаю, что это очень удобно для чтения.
0
также проходит !foo
тест.
- person hasen; 18.05.2016
undefined
отличается от false
. Это очень часто встречается с необязательными параметрами логической функции, где вы должны использовать общий подход JavaScript: function fn(flag?: boolean) { if (typeof flag === "undefined") flag = true; /* set default value */ }
- person Gingi; 27.05.2016
var isTrue; if(isTrue)//skips, if(!isTrue)// enters if(isTrue === undefined)//enters
. Также пробовал это в машинописном тексте с var isTrue:boolean
, который не был определен, и то же самое, если проверяет. @Gingi, есть ли что-то другое в том, что вы пробовали, и в том, что пробовал я?
- person Drenai; 07.08.2016
Since TypeScript is strongly-typed
Я не нашел этого в документации и сомневаюсь ... - person pawciobiel   schedule 31.08.2015if () {}
- плохо, так как это будет верно и для0
. - person Tom el Safadi   schedule 21.08.2020