Da TypeScript stark typisiert ist, wird einfach if () {}
nach gesucht null
und es undefined
klingt nicht richtig.
Hat TypeScript dafür eine spezielle Funktion oder Syntax?
Da TypeScript stark typisiert ist, wird einfach if () {}
nach gesucht null
und es undefined
klingt nicht richtig.
Hat TypeScript dafür eine spezielle Funktion oder Syntax?
Antworten:
Mit einem Jonglier-Check können Sie beide null
und undefined
mit einem Schlag testen :
if (x == null) {
Wenn Sie eine strenge Prüfung verwenden, gilt diese nur für Werte, die auf null
undefinierte Variablen festgelegt sind, und wird nicht als wahr ausgewertet:
if (x === null) {
Sie können dies mit verschiedenen Werten anhand dieses Beispiels versuchen:
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');
Ausgabe
"a == null"
"a ist undefiniert"
"b == null"
"b === null"
"false" == false
Eine nicht leere Zeichenfolge wie "false" wird ausgewertet true
.
if(x)
Style-Checks, aber nicht if(x == null)
, was nur fängt null
und undefined
. Überprüfen Sie, var c: number = 0; check(c, 'b');
ob es nicht "nully" ist null
, oder undefined
.
if( value ) {
}
wird bewerten, true
wenn value
nicht:
null
undefined
NaN
''
0
false
Typoskript enthält Javascript-Regeln.
Hat TypeScript dafür eine spezielle Funktion oder Syntax?
TypeScript versteht die JavaScript-Version vollständig something == null
.
TypeScript schließt sowohl null
und als auch korrekt ausundefined
solche Überprüfungen .
myVar == null
. Nur eine weitere Option.
== null
ist der richtige Weg, um auf null und undefiniert zu testen. !!something
ist ein nutzloser Zwang in einer Bedingung in JS (nur verwenden something
). !!something
zwingt auch 0 und '' zu false, was Sie nicht tun möchten, wenn Sie nach null / undefined suchen.
Ich habe verschiedene Tests auf dem Typoskript-Spielplatz durchgeführt:
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);
gibt:
a is null or undefined
b is null or undefined
c is defined
damit:
Ich denke, diese Antwort muss aktualisiert werden. Überprüfen Sie den Bearbeitungsverlauf auf die alte Antwort.
Grundsätzlich haben Sie drei aufgeschobene Fälle null, undefiniert und nicht deklariert (siehe den folgenden Ausschnitt).
// bad-file.ts
console.log(message)
Sie erhalten eine Fehlermeldung, dass die Variable message
undefiniert (auch als nicht deklariert bezeichnet) ist. Der Typescript-Compiler sollte dies natürlich nicht zulassen, aber WIRKLICH kann Sie nichts davon abhalten.
// evil-file.ts
// @ts-gnore
console.log(message)
Der Compiler kompiliert gerne den obigen Code. Wenn Sie also sicher sind, dass alle Variablen deklariert sind, können Sie dies einfach tun
if ( message != null ) {
// do something with the message
}
Der obige Code prüft auf null
und undefined
, ABER falls die message
Variable (aus Sicherheitsgründen) nicht deklariert ist, können Sie den folgenden Code berücksichtigen
if ( typeof(message) !== 'undefined' && message !== null ) {
// message variable is more than safe to be used.
}
Hinweis: Die Reihenfolge hier typeof(message) !== 'undefined' && message !== null
ist sehr wichtig. Sie müssen undefined
zuerst den Status überprüfen, da er genau so ist wie message != null
, danke @Jaider.
if(typeof something !== 'undefined' && something !== null){...}
In TypeScript 3.7 haben wir jetzt optionales Verketten und Nullish Coalescing , um gleichzeitig null und undefiniert zu prüfen. Beispiel:
let x = foo?.bar.baz();
Dieser Code prüft, ob foo definiert ist, andernfalls wird undefiniert zurückgegeben
alter Weg :
if(foo != null && foo != undefined) {
x = foo.bar.baz();
}
diese:
let x = (foo === null || foo === undefined) ? undefined : foo.bar();
if (foo && foo.bar && foo.bar.baz) { // ... }
Mit optionaler Verkettung wird:
let x = foo?.bar();
if (foo?.bar?.baz) { // ... }
Eine weitere neue Funktion ist Nullish Coalescing , Beispiel:
let x = foo ?? bar(); // return foo if it's not null or undefined otherwise calculate bar
Alter Weg:
let x = (foo !== null && foo !== undefined) ?
foo :
bar();
Vielleicht möchten Sie es versuchen
if(!!someValue)
mit !!
.
Erläuterung
Der erste !
verwandelt Ihren Ausdruck in einen boolean
Wert.
Dann !someValue
ist, true
ob someValue
es falsch ist und false
ob someValue
es wahr ist . Dies könnte verwirrend sein.
Durch Hinzufügen eines weiteren !
, jetzt ist der Ausdruck , true
wenn someValue
ist truthy und false
wenn someValue
ist falsy , die viel einfacher zu verwalten ist.
Diskussion
Warum beschäftige ich mich jetzt mit so if (!!someValue)
etwas?if (someValue)
mir das gleiche Ergebnis gebracht hätte?
Denn !!someValue
ist genau ein boolescher Ausdruck, während someValue
absolut alles sein könnte. Diese Art des Ausdrucks ermöglicht es nun, Funktionen (und Gott, die wir brauchen) wie folgt zu schreiben:
isSomeValueDefined(): boolean {
return !!someValue
}
anstatt:
isSomeValueDefined(): boolean {
if(someValue) {
return true
}
return false
}
Ich hoffe, es hilft.
!!'false'
ist in der Tat, true
weil 'false'
es eine gültige Zeichenfolge ist
Denn Typescript 2.x.x
Sie sollten es folgendermaßen tun (mit Type Guard ):
tl; dr
function isDefined<T>(value: T | undefined | null): value is T {
return <T>value !== undefined && <T>value !== null;
}
Warum?
Auf diese Weise isDefined()
wird der Variablentyp berücksichtigt und der folgende Code würde wissen, dass diese Prüfung berücksichtigt wird.
Beispiel 1 - Grundprüfung:
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
}
}
Beispiel 2 - Typen respektieren:
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){}
Es ist gemein! Daten
true
oder false
nur ausgewertet werden . Wenn Sie einen Booleschen Wert mit einer null
Zuweisung oder einem undefined
Wert haben, wird der Wert in beiden Fällen als ausgewertet false
.
Wenn Sie TypeScript verwenden, ist es besser, den Compiler nach Nullen und Undefinierten (oder deren Möglichkeit) suchen zu lassen, als zur Laufzeit nach ihnen zu suchen. (Wenn Sie zur Laufzeit überprüfen möchten, verwenden Sie einfach, wie viele Antworten anzeigen value == null
.)
Verwenden Sie die Kompilierungsoption strictNullChecks
, um den Compiler anzuweisen, mögliche Null- oder undefinierte Werte zu drosseln. Wenn Sie diese Option gesetzt, und dann gibt es eine Situation , wo Sie es möchten null ermöglichen und nicht definiert, können Sie die Art , wie definieren Type | null | undefined
.
Wenn Sie übergeben möchten , tslint
ohne Einstellung strict-boolean-expressions
zu allow-null-union
oder allow-undefined-union
müssen Sie die Verwendung isNullOrUndefined
von node
‚s - util
Modul oder rollen Sie Ihre eigenen:
// 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
Nicht gerade syntaktischer Zucker, aber nützlich, wenn Ihre tslint-Regeln streng sind.
Eine schnellere und kürzere Notation für null
Schecks kann sein:
value == null ? "UNDEFINED" : value
Diese Zeile entspricht:
if(value == null) {
console.log("UNDEFINED")
} else {
console.log(value)
}
Besonders wenn Sie viel null
Scheck haben, ist es eine schöne kurze Notation.
Ich hatte dieses Problem und einige der Antworten funktionieren gut, JS
aber nicht für TS
hier ist der Grund.
//JS
let couldBeNullOrUndefined;
if(couldBeNullOrUndefined == null) {
console.log('null OR undefined', couldBeNullOrUndefined);
} else {
console.log('Has some value', couldBeNullOrUndefined);
}
Das ist alles gut, da JS keine Typen hat
//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);
}
In TS , wenn die Variable nicht definiert wurde , mit , null
wenn Sie versuchen, das zu überprüfen , null
die tslint
| Compiler wird sich beschweren.
//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'.
Spät, um diesem Thread beizutreten, aber ich finde diesen JavaScript-Hack sehr praktisch, um zu überprüfen, ob ein Wert undefiniert ist
if(typeof(something) === 'undefined'){
// Yes this is undefined
}
Normalerweise mache ich den Jonglier-Check, wie Fenton bereits besprochen hat . Um die Lesbarkeit zu verbessern , können Sie isNil von ramda verwenden.
import * as isNil from 'ramda/src/isNil';
totalAmount = isNil(totalAmount ) ? 0 : totalAmount ;
Wenn Sie NUR null und undefinierte Werte vergleichen möchten , verwenden Sie den ausführlichen Beispielcode als Referenz:
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}`);
}
Wenn dies incomingValue
nicht deklariert ist, sollte TypeScript eine Ausnahme zurückgeben. Wenn dies deklariert, aber nicht definiert ist, wird dieconsole.log()
wird "Eingehender Wert ist: undefiniert" zurückgegeben. Beachten Sie, dass wir nicht den strengen Gleichheitsoperator verwenden.
Der "richtige" Weg (überprüfen Sie die anderen Antworten auf Details), wenn der incomingValue
kein boolean
Typ ist, bewerten Sie einfach, ob sein Wert wahr ist, dies wird gemäß dem Typ der Konstanten / Variablen ausgewertet. Eine true
Zeichenfolge muss mithilfe der = ''
Zuweisung explizit als Zeichenfolge definiert werden . Wenn nicht, wird es als bewertet false
. Lassen Sie uns diesen Fall im selben Kontext überprüfen:
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"
}
Sie können verwenden
if(x === undefined)
Alle,
Die Antwort mit den meisten Stimmen funktioniert nicht wirklich, wenn Sie mit einem Objekt arbeiten. In diesem Fall funktioniert die Prüfung nicht, wenn eine Eigenschaft nicht vorhanden ist. Und das war das Problem in unserem Fall: siehe dieses Beispiel:
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);
Ergebnis:
true , false, false , true (in case of !=)
true , true, true, true (in case of !==) => so in this sample not the correct answer
plunkr link: https://plnkr.co/edit/BJpVHD95FhKlpHp1skUE
Da TypeScript eine typisierte Obermenge von ES6-JavaScript ist. Und lodash sind eine Bibliothek von Javascript.
Mit lodash können Sie überprüfen, ob der Wert null oder undefiniert ist _.isNil()
.
_.isNil(value)
Wert (*): Der zu überprüfende Wert.
(boolean) : Gibt true zurück, wenn der Wert nullish ist, andernfalls false.
_.isNil(null);
// => true
_.isNil(void 0);
// => true
_.isNil(NaN);
// => false
Vorsicht, wenn Sie lokalen Speicher verwenden, kann die Zeichenfolge undefiniert und nicht der Wert undefiniert sein:
localStorage.setItem('mykey',JSON.stringify(undefined));
localStorage.getItem('mykey') === "undefined"
true
Personen finden dies möglicherweise hilfreich: 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);
});
});
Ich schreibe es immer so:
var foo:string;
if(!foo){
foo="something";
}
Dies wird gut funktionieren und ich denke, es ist sehr gut lesbar.
0
auch der !foo
Test bestanden wird.
undefined
es sich von unterscheidet false
. Dies ist sehr häufig bei optionalen booleschen Funktionsparametern, bei denen Sie den allgemeinen JavaScript-Ansatz verwenden sollten: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
. Versuchte es auch in Typoskript, mit var isTrue:boolean
dem undefiniert war, und das gleiche, wenn prüft. @Gingi, gibt es etwas anderes an dem, was du versucht hast und was ich versucht habe?
Since TypeScript is strongly-typed
Ich konnte dies nicht in den Dokumenten finden und ich habe Zweifel daran ...