Ponieważ TypeScript jest silnie napisany, po prostu używa się go if () {}
do sprawdzenia null
i undefined
nie brzmi dobrze.
Czy TypeScript ma do tego celu jakąś dedykowaną funkcję lub cukier składniowy?
typescript
null-check
David Liu
źródło
źródło
Since TypeScript is strongly-typed
Nie znalazłem tego w dokumentach i mam co do tego wątpliwości ...Odpowiedzi:
Za pomocą testu żonglowania możesz przetestować jedno
null
iundefined
jedno trafienie:Jeśli zastosujesz ścisłe sprawdzenie, będzie to prawdą tylko dla wartości ustawionych na
null
i nie będzie oceniane jako prawda dla niezdefiniowanych zmiennych:Możesz spróbować z różnymi wartościami, korzystając z tego przykładu:
Wynik
źródło
"false" == false
niepusty łańcuch taki jak „fałsz” ocenia natrue
.if(x)
typu prawda / falsey , ale nieif(x == null)
, które tylko łapiąnull
iundefined
. Sprawdź, czyvar c: number = 0; check(c, 'b');
nie jest to „nully”null
, lubundefined
.oceni,
true
czyvalue
nie jest:null
undefined
NaN
''
0
false
maszynopis zawiera reguły javascript.
źródło
TypeScript w pełni rozumie aktualną wersję JavaScript
something == null
.TypeScript poprawnie wykluczy oba
null
iundefined
przy takich kontrolach.Więcej
https://basarat.gitbook.io/typescript/recap/null-undefined
źródło
myVar == null
. Po prostu inna opcja.== null
to właściwy sposób testowania na wartość NULL i niezdefiniowany.!!something
jest bezużytecznym przymusem warunkowym w JS (wystarczy użyćsomething
).!!something
spowoduje również wymuszenie 0 i „” na false, co nie jest tym, co chcesz zrobić, jeśli szukasz wartości null / undefined.Zrobiłem różne testy na placu zabaw maszynopisu:
http://www.typescriptlang.org/play/
daje:
więc:
źródło
Myślę, że ta odpowiedź wymaga aktualizacji, sprawdź historię edycji starej odpowiedzi.
Zasadniczo masz trzy różne przypadki: zerowy, niezdefiniowany i niezadeklarowany, zobacz poniższy fragment.
Pojawi się błąd mówiący, że zmienna
message
jest niezdefiniowana (inaczej niezadeklarowana), oczywiście, kompilator Typescript nie powinien na to pozwolić, ale NAPRAWDĘ nic nie może temu zapobiec.Kompilator chętnie po prostu skompiluje powyższy kod. Jeśli więc masz pewność, że wszystkie zmienne są zadeklarowane, możesz to po prostu zrobić
powyższy kod sprawdzi,
null
czyundefined
, ALE jeślimessage
zmienna może być niezadeklarowana (dla bezpieczeństwa), możesz rozważyć następujący kodUwaga: kolejność tutaj
typeof(message) !== 'undefined' && message !== null
jest bardzo ważna, musisz najpierw sprawdzićundefined
stan, w przeciwnym razie będzie ona taka sama, jakmessage != null
dzięki, @Jaider.źródło
if(typeof something !== 'undefined' && something !== null){...}
W TypeScript 3.7 mamy teraz Opcjonalne łączenie w łańcuchy i Nullish Coalescing, aby sprawdzać null i niezdefiniowane w tym samym czasie, przykład:
kod ten sprawdzi, czy zdefiniowano foo, w przeciwnym razie zwróci niezdefiniowany
stary sposób :
to:
Z opcjonalnym łańcuchem będzie:
kolejną nową funkcją jest Nullish Coalescing , przykład:
stara droga:
źródło
Możesz spróbować
z
!!
.Wyjaśnienie
Pierwszy
!
zamieni twoje wyrażenie wboolean
wartość.To
!someValue
jest,true
jeślisomeValue
jest fałszem ifalse
jeślisomeValue
jest prawdą . To może być mylące.Dodając kolejne
!
, wyrażenie brzmi teraz,true
jeślisomeValue
jest prawdą, afalse
jeślisomeValue
jest fałszem , co jest o wiele łatwiejsze do opanowania.Dyskusja
Dlaczego mam się tym przejmować,
if (!!someValue)
gdy coś takiegoif (someValue)
dałoby mi taki sam wynik?Ponieważ
!!someValue
jest to właśnie wyrażenie logiczne, podczas gdysomeValue
może być absolutnie wszystkim. Ten rodzaj wyrażenia pozwoli teraz na pisanie funkcji (i Boże, potrzebujemy ich), takich jak:zamiast:
Mam nadzieję, że to pomoże.
źródło
!!'false'
jest wtrue
'false'
Bo
Typescript 2.x.x
powinieneś to zrobić w następujący sposób (używając ochrony typu ):tl; dr
Dlaczego?
W ten sposób
isDefined()
uszanuje typ zmiennej i poniższy kod będzie wiedział, że weźmie to pod uwagę.Przykład 1 - kontrola podstawowa:
Przykład 2 - typy uwzględniają:
źródło
to wredne! dane
źródło
true
lubfalse
tylko. Jeśli masz wartość logiczną znull
przypisaniem lubundefined
wartością, w obu przypadkach wartość zostanie oszacowana jakofalse
.Jeśli używasz TypeScript, lepiej jest pozwolić kompilatorowi sprawdzać null i niezdefiniowane (lub ich możliwości), zamiast sprawdzać je w czasie wykonywania. (Jeśli chcesz sprawdzić w czasie wykonywania, to jak wiele odpowiedzi wskazuje, po prostu użyj
value == null
).Użyj opcji kompilacji,
strictNullChecks
aby poinformować kompilator o zadławieniu możliwych wartości zerowych lub niezdefiniowanych. Jeśli ustawisz tę opcję, a to nie jest sytuacja, w której ty nie chcesz, aby wartości null i undefined, można zdefiniować typemType | null | undefined
.źródło
Jeśli chcesz przekazać
tslint
bez ustawianiastrict-boolean-expressions
naallow-null-union
luballow-undefined-union
, trzeba użyćisNullOrUndefined
znode
„sutil
modułu lub toczyć własną rękę:Niezupełnie cukier składniowy, ale przydatny, gdy twoje reguły tslint są surowe.
źródło
Szybszym i krótszym oznaczeniem
null
czeków może być:Ta linia odpowiada:
Zwłaszcza, gdy masz dużo
null
czeków, jest to miły krótki zapis.źródło
Miałem ten problem i niektóre odpowiedzi działają w porządku,
JS
ale nieTS
dlatego, że to jest powód.To wszystko dobrze, ponieważ JS nie ma typów
W TS, jeśli zmienna nie została zdefiniowana
null
przy próbie sprawdzenia,null
czytslint
| kompilator będzie narzekał.źródło
Późno dołączyłem do tego wątku, ale uważam, że ten JavaScript jest bardzo przydatny w sprawdzaniu, czy wartość jest niezdefiniowana
źródło
Zwykle sprawdzam żonglerkę, jak to już omówił Fenton . Aby uczynić go bardziej czytelnym, możesz użyć isNil z ramdy.
źródło
Mówiąc wprost, jeśli chcesz porównać TYLKO wartości puste i niezdefiniowane , użyj do tego następującego przykładowego kodu:
Jeśli
incomingValue
nie zostanie zadeklarowane, TypeScript powinien zwrócić wyjątek. Jeśli zostanie to zadeklarowane, ale nie zdefiniowane,console.log()
zwróci „Wartość przychodząca: niezdefiniowana”. Uwaga: nie używamy operatora ścisłego równości.„Prawidłowy” sposób (sprawdź pozostałe odpowiedzi w celu uzyskania szczegółowych informacji), jeśli
incomingValue
nie jestboolean
typem, po prostu oceń, czy jego wartość jest prawdziwa, zostanie to ocenione zgodnie z typem stałej / zmiennej.true
Ciąg muszą być zdefiniowane jawnie jako ciąg pomocą= ''
przyznawanie. Jeśli nie, zostanie to ocenione jakofalse
. Sprawdźmy ten przypadek, używając tego samego kontekstu:źródło
możesz użyć
źródło
Wszystko,
Odpowiedź z największą liczbą głosów, tak naprawdę nie działa, jeśli pracujesz z obiektem. W takim przypadku, jeśli właściwość nie jest obecna, sprawdzenie nie zadziała. I to był problem w naszym przypadku: zobacz tę próbkę:
Wynik:
link plunkr: https://plnkr.co/edit/BJpVHD95FhKlpHp1skUE
źródło
null
. Spróbuj tego: plnkr.co/edit/NfiVnQNes1p8PvXd1fCG?p=previewPonieważ TypeScript jest typowanym nadzbiorem JavaScript ES6. A lodash to biblioteka javascript.
Za pomocą lodash można sprawdzić, czy wartość jest pusta czy niezdefiniowana, można to zrobić za pomocą
_.isNil()
.Argumenty
wartość (*): wartość do sprawdzenia.
Zwroty
(boolean) : Zwraca true, jeśli wartość jest nullish, w przeciwnym razie false.
Przykład
Połączyć
Lodash Docs
źródło
ostrożnie, jeśli używasz pamięci lokalnej, możesz skończyć z ciągiem niezdefiniowanym zamiast z niezdefiniowaną wartością:
Ludzie mogą uznać to za przydatne: https://github.com/angular/components/blob/master/src/cdk/coercion/boolean-property.spec.ts
źródło
Zawsze piszę tak:
To zadziała dobrze i myślę, że jest bardzo czytelne.
źródło
0
również przechodzi!foo
test.undefined
jest inny niżfalse
. Jest to bardzo powszechne w przypadku opcjonalnych parametrów funkcji boolowskiej, w których należy stosować wspólne podejście JavaScript:function fn(flag?: boolean) { if (typeof flag === "undefined") flag = true; /* set default value */ }
var isTrue; if(isTrue)//skips, if(!isTrue)// enters if(isTrue === undefined)//enters
. Wypróbowałem to również w maszynopisie, zvar isTrue:boolean
którym nie zdefiniowano, i to samo, jeśli sprawdza. @Gingi, czy jest coś innego w tym, co próbowałeś i co próbowałem?