Étant donné que TypeScript est fortement typé, il suffit de l'utiliser if () {}
pour vérifier null
et undefined
ne sonne pas correctement.
TypeScript a-t-il une fonction ou un sucre de syntaxe dédié à cela?
Étant donné que TypeScript est fortement typé, il suffit de l'utiliser if () {}
pour vérifier null
et undefined
ne sonne pas correctement.
TypeScript a-t-il une fonction ou un sucre de syntaxe dédié à cela?
Réponses:
À l'aide d'un test de jonglage, vous pouvez tester les deux null
et undefined
en un coup:
if (x == null) {
Si vous utilisez un contrôle strict, il ne sera vrai que pour les valeurs définies sur null
et ne sera pas évalué comme vrai pour les variables non définies:
if (x === null) {
Vous pouvez essayer cela avec différentes valeurs en utilisant cet exemple:
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');
Production
"a == null"
"a n'est pas défini"
"b == null"
"b === null"
"false" == false
une chaîne non vide comme "false" est évaluée true
.
if(x)
vérifications de style véridique / falsey , mais non if(x == null)
, qui ne fait qu'attraper null
et undefined
. Vérifiez que var c: number = 0; check(c, 'b');
ce n'est pas "nully",, null
ou undefined
.
if( value ) {
}
évaluera true
si ce value
n'est pas le cas:
null
undefined
NaN
''
0
false
tapuscrit inclut des règles javascript.
TypeScript a-t-il une fonction ou un sucre de syntaxe dédié pour cela?
TypeScript comprend parfaitement la version JavaScript qui est something == null
.
TypeScript exclura correctement à la fois null
et undefined
avec de telles vérifications.
myVar == null
. Juste une autre option.
== null
est la bonne façon de tester null & undefined. !!something
est une contrainte inutile dans un conditionnel en JS (utilisez simplement something
). !!something
contraindra également 0 et '' à false, ce qui n'est pas ce que vous voulez faire si vous recherchez null / undefined.
J'ai fait différents tests sur le terrain de jeu dactylographié:
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);
donne:
a is null or undefined
b is null or undefined
c is defined
donc:
Je pense que cette réponse a besoin d'une mise à jour, consultez l'historique des modifications pour l'ancienne réponse.
Fondamentalement, vous avez trois cas différés nuls, non définis et non déclarés, voir l'extrait ci-dessous.
// bad-file.ts
console.log(message)
Vous obtiendrez une erreur indiquant que la variable message
n'est pas définie (aka non déclarée), bien sûr, le compilateur Typescript ne devrait pas vous permettre de le faire, mais VRAIMENT rien ne peut vous empêcher.
// evil-file.ts
// @ts-gnore
console.log(message)
Le compilateur se contentera de compiler le code ci-dessus. Donc, si vous êtes sûr que toutes les variables sont déclarées, vous pouvez simplement le faire
if ( message != null ) {
// do something with the message
}
le code ci-dessus vérifiera null
et undefined
, MAIS dans le cas où la message
variable pourrait ne pas être déclarée (par sécurité), vous pouvez considérer le code suivant
if ( typeof(message) !== 'undefined' && message !== null ) {
// message variable is more than safe to be used.
}
Remarque: l'ordre ici typeof(message) !== 'undefined' && message !== null
est très important, vous devez d'abord vérifier l' undefined
état, sinon ce sera le même que message != null
, merci @Jaider.
if(typeof something !== 'undefined' && something !== null){...}
Dans TypeScript 3.7, nous avons maintenant le chaînage facultatif et la coalescence nulle pour vérifier null et indéfini en même temps, par exemple:
let x = foo?.bar.baz();
ce code vérifiera si foo est défini sinon il retournera non défini
ancienne façon :
if(foo != null && foo != undefined) {
x = foo.bar.baz();
}
cette:
let x = (foo === null || foo === undefined) ? undefined : foo.bar();
if (foo && foo.bar && foo.bar.baz) { // ... }
Avec le chaînage optionnel sera:
let x = foo?.bar();
if (foo?.bar?.baz) { // ... }
une autre nouvelle fonctionnalité est Nullish Coalescing , par exemple:
let x = foo ?? bar(); // return foo if it's not null or undefined otherwise calculate bar
ancienne façon:
let x = (foo !== null && foo !== undefined) ?
foo :
bar();
Vous voudrez peut-être essayer
if(!!someValue)
avec !!
.
Explication
Le premier !
transformera votre expression en boolean
valeur.
Alors !someValue
c'est true
si someValue
est faux et false
si someValue
c'est vrai . Cela pourrait prêter à confusion.
En ajoutant un autre !
, l'expression est maintenant true
si someValue
est vraie et false
si someValue
est fausse , ce qui est beaucoup plus facile à gérer.
Discussion
Maintenant, pourquoi est-ce que je me dérange if (!!someValue)
quand quelque chose comme ça if (someValue)
m'aurait donné le même résultat?
Parce que !!someValue
c'est précisément une expression booléenne, alors qu'elle someValue
pourrait être absolument n'importe quoi. Ce type d'expression permettra désormais d'écrire des fonctions (et Dieu nous en avons besoin) comme:
isSomeValueDefined(): boolean {
return !!someValue
}
au lieu de:
isSomeValueDefined(): boolean {
if(someValue) {
return true
}
return false
}
J'espère que ça aide.
!!'false'
est en acte true
car 'false'
est une chaîne valide
Car Typescript 2.x.x
vous devez le faire de la manière suivante (en utilisant type guard ):
tl; dr
function isDefined<T>(value: T | undefined | null): value is T {
return <T>value !== undefined && <T>value !== null;
}
Pourquoi?
De cette façon isDefined()
, respectera le type de variable et le code suivant saura tenir compte de cette vérification.
Exemple 1 - vérification de base:
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
}
}
Exemple 2 - les types respectent:
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){}
c'est méchant!
true
ou false
seulement. Si vous avez un booléen avec une null
affectation ou une undefined
valeur, dans les deux cas, la valeur sera évaluée comme false
.
Si vous utilisez TypeScript, il est préférable de laisser le compilateur rechercher les valeurs nulles et indéfinies (ou la possibilité de celles-ci), plutôt que de les vérifier au moment de l'exécution. (Si vous voulez vérifier au moment de l'exécution, alors comme de nombreuses réponses l'indiquent, utilisez simplementvalue == null
).
Utilisez l'option de compilation strictNullChecks
pour indiquer au compilateur d'étouffer les éventuelles valeurs nulles ou non définies. Si vous activez cette option, et puis il y a une situation où vous ne voulez autoriser nulle et non défini, vous pouvez définir le type que Type | null | undefined
.
Si vous voulez passer tslint
sans mettre strict-boolean-expressions
à allow-null-union
ou allow-undefined-union
, vous devez utiliser isNullOrUndefined
du node
« s util
module ou rouler votre propre:
// 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
Pas exactement du sucre syntaxique mais utile lorsque vos règles tslint sont strictes.
Une notation plus rapide et plus courte pour les null
chèques peut être:
value == null ? "UNDEFINED" : value
Cette ligne équivaut à:
if(value == null) {
console.log("UNDEFINED")
} else {
console.log(value)
}
Surtout quand vous avez beaucoup de null
contrôle, c'est une belle notation courte.
J'ai eu ce problème et une partie de la réponse fonctionne très bien pour JS
mais pas pour TS
ici est la raison.
//JS
let couldBeNullOrUndefined;
if(couldBeNullOrUndefined == null) {
console.log('null OR undefined', couldBeNullOrUndefined);
} else {
console.log('Has some value', couldBeNullOrUndefined);
}
C'est très bien car JS n'a pas de types
//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);
}
Dans TS si la variable n'a pas été définie avec null
lorsque vous essayez de vérifier que null
le tslint
| le compilateur se plaindra.
//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'.
Tard pour rejoindre ce fil mais je trouve ce hack JavaScript très pratique pour vérifier si une valeur n'est pas définie
if(typeof(something) === 'undefined'){
// Yes this is undefined
}
De manière détaillée, si vous souhaitez comparer les valeurs nulles et non définies UNIQUEMENT , utilisez l'exemple de code suivant pour référence:
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}`);
}
Si incomingValue
n'est pas déclaré, TypeScript doit renvoyer une exception. Si cela est déclaré mais non défini, leconsole.log()
retourne "La valeur entrante est: non définie". Notez que nous n'utilisons pas l'opérateur strict strict.
La manière "correcte" (vérifiez les autres réponses pour plus de détails), si le incomingValue
n'est pas un boolean
type, évaluez simplement si sa valeur est vraie, cela sera évalué selon le type de constante / variable. Une true
chaîne doit être définie explicitement en tant que chaîne à l'aide de l' = ''
affectation. Sinon, il sera évalué comme false
. Vérifions ce cas en utilisant le même contexte:
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"
}
vous pouvez utiliser
if(x === undefined)
Tout,
La réponse avec le plus de votes ne fonctionne pas vraiment si vous travaillez avec un objet. Dans ce cas, si une propriété n'est pas présente, le chèque ne fonctionnera pas. Et c'était le problème dans notre cas: voir cet exemple:
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);
Résultat:
true , false, false , true (in case of !=)
true , true, true, true (in case of !==) => so in this sample not the correct answer
lien plunkr: https://plnkr.co/edit/BJpVHD95FhKlpHp1skUE
null
. Essayez ceci: plnkr.co/edit/NfiVnQNes1p8PvXd1fCG?p=preview
Puisque TypeScript est un sur-ensemble typé de JavaScript ES6. Et lodash est une bibliothèque de javascript.
L'utilisation de lodash pour vérifier si la valeur est nulle ou non définie peut être effectuée à l'aide de _.isNil()
.
_.isNil(value)
valeur (*): La valeur à vérifier.
(booléen) : retourne vrai si la valeur est nulle, sinon faux.
_.isNil(null);
// => true
_.isNil(void 0);
// => true
_.isNil(NaN);
// => false
attention si vous utilisez le stockage local, vous pouvez vous retrouver avec la chaîne non définie plutôt que la valeur non définie:
localStorage.setItem('mykey',JSON.stringify(undefined));
localStorage.getItem('mykey') === "undefined"
true
Les gens peuvent trouver cela utile: 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);
});
});
Je l'écris toujours comme ceci:
var foo:string;
if(!foo){
foo="something";
}
Cela fonctionnera bien et je pense que c'est très lisible.
0
réussit également le !foo
test.
undefined
est différent de false
. Ceci est très courant avec les paramètres de fonction booléenne facultatifs, où vous devez utiliser l'approche JavaScript commune: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
. A également essayé en tapant avecvar isTrue:boolean
lequel n'était pas défini, et la même chose si vérifie. @ Gingi, y a-t-il quelque chose de différent dans ce que tu as essayé et ce que j'ai essayé?
Since TypeScript is strongly-typed
Je n'ai pas trouvé ça dans ses documents et j'ai des doutes à ce sujet ...