Есть ли выделенная функция для проверки нулевого и неопределенного в TypeScript?

212

Так как TypeScript строго типизирован, просто используя if () {} для проверки null и undefined звучит не так.

Использует ли TypeScript выделенную функцию или синтаксический сахар для этого?

  • 4
    Since TypeScript is strongly-typed я не смог найти его в его документации, и у меня есть сомнения по этому поводу ...
  • 2
    Рекомендую ознакомиться с последними ненулевыми типами, это Typescript 2, но уже в бета-версии на сегодняшний день. [Обнуляемые типы # 7140] ( github.com/Microsoft/TypeScript/pull/7140 )
Показать ещё 1 комментарий
Теги:

15 ответов

214

Используя проверку жонглирования, вы можете проверить как 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"

  • 27
    Что такое «жонглирование»?
  • 10
    @akapelko - это место, где тип манипулируется (т. е. «можем ли мы сделать этот тип логическим»). Так, например, пустая строка рассматривается как логическое значение false. Типичная ошибка при жонглировании: "false" == false - непустая строка, такая как «false», оценивается как true .
Показать ещё 6 комментариев
128
if( value ) {
}

будет оцениваться как true если value не указано:

  • null
  • undefined
  • NaN
  • пустая строка ''
  • 0
  • false

машинописный текст включает в себя правила javascript.

  • 3
    Что если значение имеет логический тип?
  • 0
    да, возвращаемый тип логический
Показать ещё 8 комментариев
29

Я провел различные тесты на игровой площадке 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

так:

  • проверка, если (a == null) правильно знать, является ли a null или undefined
  • проверка, если (a!= null) правильно знать, определено ли a
  • проверка того, что (а) неправильно знать, определено ли значение
  • 0
    Зачем вам использовать площадку TypeScript для этого? Ничто здесь не имеет ничего общего с TypeScript.
  • 8
    Поскольку этот вопрос был связан с Typescript, я пытался протестировать различные предлагаемые решения с помощью транспилятора Typescript.
Показать ещё 1 комментарий
25

Есть ли у TypeScript выделенная функция или синтаксический сахар для этого

Нет. Я просто делаю something == null так же, как JavaScript.

  • 1
    Мне нравится делать два равных myVar == null . Просто еще один вариант.
  • 21
    == null - это правильный способ проверки на ноль и неопределенность. !!something - бесполезное принуждение в условном выражении в JS (просто используйте something ). !!something то также приведет 0 и '' к ложному, а это не то, что вы хотите сделать, если вы ищете null / undefined.
11
if(data){}

это значение! data​​p >

  • NULL
  • undefined
  • ложь
  • ....
  • 2
    А если данные булева типа?
  • 0
    Можете ли вы объединить две переменные, например. if (value1 && value2), чтобы проверить, являются ли оба они неопределенными?
10

Поскольку я использую угловые и угловые на основе машинописных текстов, я перечислю возможные сценарии для проверки типа, нулевого, пустого и неопределенного.

Это то, что я знаю

  1. if(!something)//to check null, undefined, false or empty
  2. if(something == null)//to check null or undefined
  3. if(something === null)//to check only if null

Кроме того, есть официальная документация, которую вы можете использовать для получения более подробной информации.

TL; DR

В JavaScript null не является фактически null object, typeof undefined не undefined но typeof null является object.

Вам также может понадобиться знать, что == в JavaScript сравнивает значение, а не тип, но === сравнивает как тип, так и значение, например 1 == '1'//return true но 1 === '1'//return false, то же самое для null и undefined например null == undefined//return true но null === undefined//return false

Надеюсь, это поможет кому-то.

  • 3
    М. Камаль, если что-то = 0, ваша проверка с! Чем-то доставит вам проблемы.
  • 0
    @arturios не могли бы вы дать мне пример !!
Показать ещё 5 комментариев
7

Вы можете попробовать

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
}

Я надеюсь, что это помогает.

  • 0
    Итак, если someValue равно 'false' (со строковым типом), то !! someValue равно false (логический тип)?
  • 0
    Я думаю, вы можете так сказать. Эта техника точно используется, чтобы избежать такого рода путаницы. Я надеюсь тебе понравится!
Показать ещё 3 комментария
4

Если вы используете TypeScript, это лучший подход, позволяющий компилятору проверять значения null и undefineds (или их возможности), а не проверять их во время выполнения. (Если вы хотите проверить во время выполнения, то, как указано в большинстве ответов, просто используйте value == null).

Используйте параметр компиляции strictNullChecks, чтобы сообщить компилятору, чтобы он подавил возможные значения null или undefined. Если вы установите этот параметр, а затем появится ситуация, когда вы do хотите разрешить null и undefined, вы можете определить тип как Type | null | undefined.

2

Если вы хотите передать 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 строги.

1

Для Typescript 2.xx вы должны сделать это следующим образом:

ТЛ; др

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
  }
}
0

Более быстрая и короткая запись для null проверок может быть:

value == null ? "UNDEFINED" : value

Эта строка эквивалентна:

if(value == null) {
       console.log("UNDEFINED")
} else {
    console.log(value)
}

Особенно, когда у вас много null проверки, это хорошая короткая нотация.

0

Поскольку 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

Ссылка на сайт

Документы Lodash

0

Все,

Ответ с большинством голосов, на самом деле не работает, если вы работаете с объектом. В этом случае, если свойство отсутствует, проверка не будет работать. И это было проблемой в нашем случае: см. Этот пример:

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

  • 0
    Это не хороший тест. Ни одно из этих значений не является строго null . Попробуйте это: plnkr.co/edit/NfiVnQNes1p8PvXd1fCG?p=preview
0

вы можете использовать

if(x === undefined)
-3

Я всегда пишу это так:

var foo:string;

if(!foo){
   foo="something";    
}

Это будет хорошо работать, и я думаю, что это очень читаемо.

  • 16
    Не работает для чисел, потому что 0 также проходит тест !foo .
  • 9
    Также не работает для логических значений, где undefined отличается от false . Это очень часто встречается с необязательными параметрами булевых функций, где вы должны использовать общий подход JavaScript: function fn(flag?: boolean) { if (typeof flag === "undefined") flag = true; /* set default value */ }
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню