Есть ли способ проверить наличие null и undefined?

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

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


person David Liu    schedule 10.03.2015    source источник
comment
Since TypeScript is strongly-typed Я не нашел этого в документации и сомневаюсь ...   -  person pawciobiel    schedule 31.08.2015
comment
Рекомендуем ознакомиться с последними типами, не допускающими значения NULL, это Typescript 2, но на сегодняшний день он уже находится в стадии бета-тестирования. [Типы, не допускающие значения NULL # 7140] (github.com/Microsoft/TypeScript/pull/7140)   -  person RyBolt    schedule 05.08.2016
comment
TypeScript не имеет специальных функций, которые бы что-либо делали. Это система набора текста и транспилятор, а не библиотека.   -  person    schedule 09.08.2017
comment
Как вы говорите, просто проверять if () {} - плохо, так как это будет верно и для 0.   -  person Tom el Safadi    schedule 21.08.2020


Ответы (24)


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

person Fenton    schedule 11.03.2015
comment
Что такое жонглирование-чек? - person kolobok; 01.08.2016
comment
@akapelko - это то место, где манипулируют типом (т.е. можем ли мы сделать этот тип логическим). Так, например, пустая строка рассматривается как логическое значение false. Распространенная ошибка при жонглировании: "false" == false непустая строка, такая как false, оценивается как true. - person Fenton; 01.08.2016
comment
Это происходит из-за "приведения типов" в JS. - person Astravagrant; 16.01.2017
comment
За исключением случая, когда x равен 0 (и это допустимое значение), он пройдет ваш тест undefined / null. - person Jon Gunter; 22.06.2017
comment
@JonGunter, что было бы верно для правдивых / ложных проверок стиля if(x), но не if(x == null), который улавливает только null и undefined. Проверьте это с помощью var c: number = 0; check(c, 'b');, это не nully, null или undefined. - person Fenton; 09.08.2017
comment
Является ли if (! X) равным if (x == null)? - person developer; 03.11.2017
comment
@developer - не совсем так, поскольку if (!x) будет рассматривать (например) число 0 и строку '' как ноль, тогда как if (x == null) - нет. - person Fenton; 04.11.2017
comment
Как насчет проверки на ненулевое или неопределенное значение? if ( x!= null) эквивалентно if (!(x != null))? - person Mark Meuer; 13.03.2018
comment
@Fenton, я думаю, ты хотел сказать ложь, а не ноль - person stonedauwg; 04.12.2020

if( value ) {
}

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

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

Машинопись включает правила javascript.

person Ramazan Sağır    schedule 17.05.2017
comment
Что делать, если значение имеет логический тип? - person counterflow; 07.10.2017
comment
Можете ли вы объединить две переменные, например. if (value1 && value2), чтобы проверить, не определены ли оба из них? - person ARK; 17.11.2017
comment
@AkshayrajKore да, ты можешь - person Ramazan Sağır; 22.11.2017
comment
А теперь, если я жду номер и хочу проверить, не является ли это число нулевым, но, допустим, его значение равно 0; он не проходит проверку состояния, так как я правильно это делаю с числами? - person Alex; 27.02.2018
comment
@Alex, если значение == 0 возвращает false - person Ramazan Sağır; 27.02.2018
comment
@ RamazanSağır да, спасибо, я знаю это, но факт, что значение 0 - это что-то действительное, что я могу иметь, единственная проверка, которую я хочу сделать, это то, что переменная не является ни нулевой, ни неопределенной. Я читал, что могу сделать это, используя val! = Null (! = Вместо! == также проверяет неопределенное значение) - person Alex; 27.02.2018
comment
@ RamazanSağır Я только что проверил с помощью одного из своих фрагментов кода, и если (undefined) оценивается как истина. Это мой объект {businessId: undefined}, как выглядит, тогда, если я проверю, оценивается ли (businessId) как истина. :( - person Yohan Hirimuthugoda; 02.06.2018
comment
@ RamazanSağır Я обнаружил, что причина в том, что ключевое слово undefined окружено двойными кавычками. В противном случае, если (undefined) оценивается как ложь; - person Yohan Hirimuthugoda; 02.06.2018
comment
Это решение не будет работать, если включено правило tslint - строго-логические-выражения. - person ip_x; 24.09.2018
comment
Он будет оценивать ложь, если ценим нас ложью, вот так просто. - person Ayfri; 18.04.2020

В TypeScript 3.7 теперь есть Необязательное связывание и Нулевое объединение для проверки null и undefined заодно пример:

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();

БОНУС  введите описание изображения здесь

person Fateh Mohamed    schedule 25.11.2019
comment
Теперь это должен быть принятый ответ. Typescript 3.7 также поддерживает Nullish Coalescing. var foo = possibleUndefinedOrNull ?? fallbackValueIfFirstValueIsUndefinedOrNull; Вот документация: typescriptlang.org/docs/handbook / release-notes / - person tkd_aj; 26.11.2019
comment
Дополнительная цепочка и Nullish Coalescing великолепны, но в случае одного if stmt, такого как if (context != null) word.ctx = context;, все равно придется прибегать к старой проверке жонглирования, как описано в одобренном комментарии stackoverflow.com/a/28984306/407986 - person dVaffection; 28.10.2020
comment
Да, почти для сценариев мы могли бы 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

person basarat    schedule 10.03.2015
comment
Мне нравится делать два равных myVar == null. Еще один вариант. - person David Sherret; 11.03.2015
comment
== 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:

  • проверка того, является ли (a == null) правильным, чтобы знать, является ли a null или undefined
  • проверка правильности (a! = null), чтобы знать, определено ли a
  • проверка того, является ли (а) неправильным, чтобы узнать, определено ли а
person Juangui Jordán    schedule 21.10.2016
comment
Зачем вам для этого нужна игровая площадка TypeScript? Здесь нет ничего общего с TypeScript. - person ; 10.08.2017
comment
Поскольку вопрос был связан с Typescript, я пытался протестировать различные предлагаемые решения на транспиляторе Typescript. - person Juangui Jordán; 11.08.2017
comment
Транспиллер TS вообще не будет преобразовывать этот код. - person ; 11.08.2017

Я думаю, что этот ответ нуждается в обновлении, проверьте историю изменений для старого ответа.

По сути, у вас есть три различных случая: 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.

person Ahmed Kamal    schedule 10.07.2018
comment
M. Kamal: если something = 0, проверка с помощью! Something вызовет у вас проблемы. - person justcode; 21.11.2018
comment
@arturios, не могли бы вы привести мне пример !! - person Ahmed Kamal; 21.11.2018
comment
@M. Камаль: Если вы имеете дело с числами, 0 будет интерпретировано как ложное, что является проблемой. // В этом случае значение будет неопределенным, что нормально var value; if (! value) {console.log (value is false, undefined или empty)} // В этом случае значение установлено как 0, это проблема использования этого подхода, когда вы имеете дело с числовым значением = 0; if (! значение) {console.log (значение false, undefined или пусто)} - person justcode; 21.11.2018
comment
@arturios Но 0 уже является ложным значением в JavaScript !! так какой здесь смысл? - person Ahmed Kamal; 21.11.2018
comment
Да, я понимаю, но вопрос относится только к undefined и null, но теперь я смотрю, что вы также добавили комментарий false. - person justcode; 21.11.2018
comment
Для чего: я бы написал обновление как typeof sth !== 'undefined' && sth !== null. Поскольку тесты выполняются слева направо, у меня была ошибка с неопределенным sth для теста sth !== null - person Al-un; 17.01.2019
comment
@ Al-un nope, посмотрите это в действии здесь - person Ahmed Kamal; 18.01.2019
comment
обновленная версия неверна. Первое, что нужно проверить, должно быть undefined ... например: 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
}

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

person avi.elkharrat    schedule 12.04.2018
comment
Итак, если someValue имеет значение false (со строковым типом), то !! someValue имеет значение false (логический тип)? - person paul cheung; 12.02.2019
comment
Думаю, вы можете так сказать. Этот прием как раз и используется для того, чтобы избежать подобной путаницы. Я надеюсь тебе это понравится! - person avi.elkharrat; 12.02.2019
comment
но что меня смутило !! "ложь" равно истина. Просто из-за этого случая я не могу использовать эту технику. - person paul cheung; 12.02.2019
comment
!!'false' на деле true, потому что 'false' - допустимая строка - person avi.elkharrat; 12.02.2019
comment
так что этот метод не может покрыть этот случай, или есть обходное решение? - person paul cheung; 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
  }
}
person Sergei Panfilov    schedule 30.08.2018
comment
Я бы хотел, чтобы они добавили это как служебную функцию. - person Totati; 13.11.2020

if(data){}

это значит! данные

  • нулевой
  • неопределенный
  • ложный
  • ....
person artemitSoft    schedule 20.01.2017
comment
А если данные логического типа? - person counterflow; 07.10.2017
comment
Можете ли вы объединить две переменные, например. if (value1 && value2), чтобы проверить, не определены ли оба из них? - person ARK; 17.11.2017
comment
@ianstigator Логическое значение может быть оценено только как 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"
}
person KBeDev    schedule 04.03.2020
comment
somethingToCompare == (undefined || ноль). (undefined || null) разрешается в null, так что это нечеткое сравнение между somethingToCompare и null - person carlosvini; 23.04.2020
comment
@carlosvini Конечно, сравнение должно быть подробным и содержать код для справки. В этом причина нестрогого сравнения равных. Цель ответа - быть ясной и пояснительной. Отредактирую текст, чтобы не было путаницы - person KBeDev; 23.04.2020
comment
Я не понимаю о чем ты. Код не является подробным или явным, в лучшем случае он сбивает с толку, а в худшем - просто неверен. Код 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.

person Community    schedule 23.05.2017

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

person Graeme Wicksted    schedule 14.11.2017

Самый простой способ - использовать:

import { isNullOrUndefined } from 'util';

и тогда:

if (!isNullOrUndefined(foo))

person Ruthi    schedule 30.09.2020
comment
Здесь отлично работает - person Sindri Þór; 03.04.2021
comment
Из документации по функциям: устарело с версии 4.0.0 - используйте вместо этого value === null || value === undefined. - person Aleksei; 04.06.2021

Поздно присоединяться к этой теме, но я нахожу этот JavaScript-хакер очень удобным для проверки того, не определено ли значение.

 if(typeof(something) === 'undefined'){
   // Yes this is undefined
 }
person Shahid Manzoor Bhat    schedule 09.04.2019

Может быть, слишком поздно! но вы можете использовать оператор ?? в машинописном тексте. см. https://mariusschulz.com/blog/nullish-coalescing-the-operator-in-typescript

person Ali Qamsari    schedule 21.05.2021

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

if(x === undefined)
person akshay reddy    schedule 23.05.2017

Все,

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

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

person Ben Croughs    schedule 10.10.2017
comment
Это плохой тест. Ни одно из этих значений не является строго 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 проверок, это хорошая короткая запись.

person Harry Stylesheet    schedule 26.10.2018

У меня была эта проблема, и некоторые ответы отлично работают для 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'.
person T04435    schedule 21.02.2019

Обычно я провожу проверку, поскольку Фентон уже обсуждал. Чтобы сделать его более читабельным, вы можете использовать isNil от ramda.

import * as isNil from 'ramda/src/isNil';

totalAmount = isNil(totalAmount ) ? 0 : totalAmount ;
person Neo    schedule 21.06.2019

осторожно, если вы используете локальное хранилище, вы можете получить строку 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);
  });
});
person robert king    schedule 09.09.2019

Поскольку TypeScript - это типизированный надмножество ES6 JavaScript. А lodash - это библиотека javascript.

Использование lodash для проверки, является ли значение нулевым или неопределенным, может быть выполнено с помощью _.isNil().

_.isNil(value)

Аргументы

значение (*): значение для проверки.

Возврат

(логическое): возвращает истину, если значение равно нулю, иначе - ложь.

Пример

_.isNil(null);
// => true

_.isNil(void 0);
// => true

_.isNil(NaN);
// => false

Ссылка

Документы Lodash

person 7e2e63de    schedule 02.08.2018
comment
Почему этот метод -2? Lodash плохо работает с типовым скриптом? - person Thomas Poignant; 13.06.2019

Мы используем помощник 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;
}


person Freewalker    schedule 14.04.2021

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

var foo:string;

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

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

person AlexB    schedule 11.03.2015
comment
Не работает для чисел, потому что 0 также проходит !foo тест. - person hasen; 18.05.2016
comment
Не работает и для логических значений, где undefined отличается от false. Это очень часто встречается с необязательными параметрами логической функции, где вы должны использовать общий подход JavaScript: function fn(flag?: boolean) { if (typeof flag === "undefined") flag = true; /* set default value */ } - person Gingi; 27.05.2016
comment
Кажется, работает нормально для логических значений: var isTrue; if(isTrue)//skips, if(!isTrue)// enters if(isTrue === undefined)//enters. Также пробовал это в машинописном тексте с var isTrue:boolean, который не был определен, и то же самое, если проверяет. @Gingi, есть ли что-то другое в том, что вы пробовали, и в том, что пробовал я? - person Drenai; 07.08.2016