Так как TypeScript строго типизирован, просто используя if () {}
для проверки null и undefined звучит не так.
Использует ли TypeScript выделенную функцию или синтаксический сахар для этого?
Так как TypeScript строго типизирован, просто используя if () {}
для проверки null и undefined звучит не так.
Использует ли TypeScript выделенную функцию или синтаксический сахар для этого?
Используя проверку жонглирования, вы можете проверить как 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 undefined"
"b == null"
"b === null"
if( value ) {
}
будет оцениваться как true
если value
не указано:
null
undefined
NaN
''
0
false
машинописный текст включает в себя правила javascript.
Я провел различные тесты на игровой площадке typescript:
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
так:
Есть ли у TypeScript выделенная функция или синтаксический сахар для этого
Нет. Я просто делаю something == null
так же, как JavaScript.
Я думаю, что этот ответ нуждается в обновлении, проверьте историю изменений для старого ответа.
По сути, у вас есть три разных случая: 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
Null, спасибо @Jaider.
Вы можете попробовать
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
}
Я надеюсь, что это помогает.
if(data){}
это значение! datap >
Для Typescript 2.x.x
вы должны сделать это следующим образом (используя type guard):
ТЛ; др
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 ok - we know it number
}
}
Если вы используете TypeScript, лучше подходить к компилятору, чтобы он проверял наличие нулей и неопределенных значений (или возможность этого), а не проверял их во время выполнения. (Если вы хотите проверить во время выполнения, то, как указывают многие ответы, просто используйте value == null
).
Используйте опцию компиляции strictNullChecks
чтобы сообщить компилятору о возможных пустых или неопределенных значениях. Если вы установите этот параметр, а затем возникает ситуация, когда вы хотите, чтобы утратившим неопределенными, вы можете определить тип, Type | null | undefined
Type | null | undefined
Type | null | undefined
Если вы хотите передать tslint
без установки strict-boolean-expressions
в allow-null-union
или allow-undefined-union
, вам нужно использовать модуль isNullOrUndefined
от node
util
или перевернуть свой собственный:
// 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 строги.
Все,
Ответ с большинством голосов, на самом деле не работает, если вы работаете с объектом. В этом случае, если свойство отсутствует, проверка не будет работать. И это было проблемой в нашем случае: см. Этот пример:
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
проверок может быть:
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);
}
В ТС, если переменная не была определена с 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'.
Поздно присоединиться к этой теме, но я считаю, что этот хак JavaScript очень удобен при проверке, является ли значение неопределенным
if(typeof(something) === 'undefined'){
// Yes this is undefined
}
Обычно я делаю проверку жонглирования, как уже обсуждал Фентон. Чтобы сделать его более читабельным, вы можете использовать isNil из ramda.
import * as isNil from 'ramda/src/isNil';
totalAmount = isNil(totalAmount ) ? 0 : totalAmount ;
будьте осторожны, если вы используете локальное хранилище, вы можете получить строку 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);
});
});
вы можете использовать
if(x === undefined)
Поскольку TypeScript является типизированным надмножеством JavaScript ES6. И lodash - это библиотека javascript.
Использование lodash для проверки, если значение равно null или undefined, может быть выполнено с помощью _.isNil()
.
_.isNil(value)
value (*): значение для проверки.
(boolean): Возвращает true, если значение nullish, else false.
_.isNil(null);
// => true
_.isNil(void 0);
// => true
_.isNil(NaN);
// => false
Я всегда пишу это так:
var foo:string;
if(!foo){
foo="something";
}
Это будет хорошо работать, и я думаю, что это очень читаемо.