Comme TypeScript est fortement typé, utiliser simplement if () {}
pour vérifier les valeurs null et indéfini ne semble pas correct.
TypeScript a-t-il un sucre de fonction ou de syntaxe dédié à cela?
En utilisant un test de jonglerie, vous pouvez tester null
et undefined
en un coup:
if (x == null) {
Si vous utilisez une vérification stricte, elle ne sera vraie que pour les valeurs définies à null
et ne sera pas évaluée comme vraie pour les variables non définies:
if (x === null) {
Vous pouvez essayer ceci 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');
Sortie
"a == null"
"a n'est pas défini"
"b == null"
"b === null"
if( value ) {
}
sera évalué à true
si value
n'est pas:
null
undefined
NaN
''
0
false
TypeScript inclut des règles javascript.
J'ai fait différents tests sur le terrain de jeu 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);
donne:
a is null or undefined
b is null or undefined
c is defined
alors:
Est-ce que TypeScript a le sucre de fonction ou de syntaxe dédié pour ceci
Non, je ne fais que something == null
comme JavaScript.
if(data){}
c'est méchant! data
Vous voudrez peut-être essayer
if(!!someValue)
avec !!
.
Explication
Le premier !
transformera votre expression en une valeur boolean
.
Alors !someValue
est true
si someValue
est falsy et false
si someValue
est truthy. Cela pourrait être déroutant.
En ajoutant un autre !
, l'expression est maintenant true
si someValue
est truthy et false
si someValue
est falsy, ce qui est beaucoup plus facile à gérer.
Discussion
Maintenant, pourquoi est-ce que je me dérange avec if (!!someValue)
alors que quelque chose comme if (someValue)
m'aurait donné le même résultat?
Parce que !!someValue
est précisément une expression booléenne, alors que someValue
pourrait être absolument n'importe quoi. Ce type d’expression va maintenant permettre 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.
Si vous utilisez TypeScript, il est préférable de laisser le compilateur vérifier les valeurs nulles et non définies (ou leur possibilité) 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 beaucoup de réponses l'indiquent, utilisez simplement value == null
).
Utilisez l’option de compilation strictNullChecks
pour indiquer au compilateur d’étouffer les éventuelles valeurs NULL ou indéfinies. Si vous définissez cette option et qu'il y a une situation dans laquelle vous do souhaitez autoriser les valeurs null et indéfinie, vous pouvez définir le type en tant que Type | null | undefined
.
Pour TypeScript 2.x.x
, vous devriez le faire de la manière suivante:
tl; dr
function isDefined<T>(value: T | undefined | null): value is T {
return <T>value !== undefined && <T>value !== null;
}
Pourquoi?
De cette manière, isDefined()
respectera le type de variable et le code suivant saura prendre en compte cette vérification.
Exemple 1 - Contrôle 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 - respect des types:
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
}
}
Si vous voulez passer tslint
sans définir strict-boolean-expressions
en allow-null-union
ou allow-undefined-union
, vous devez utiliser le module isNullOrUndefined
du node
's util
ou créer 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
Sucre pas exactement syntaxique mais utile quand vos règles de tslint sont strictes.
J'ai eu ce problème et une partie de la réponse fonctionne très bien pour JS
mais pas pour TS
voici la raison.
//JS
let couldBeNullOrUndefined;
if(couldBeNullOrUndefined == null) {
console.log('null OR undefined', couldBeNullOrUndefined);
} else {
console.log('Has some value', couldBeNullOrUndefined);
}
Tout cela est 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
est tslint
| le compilateur va se plaindre.
//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'.
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, la vérification 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
Une notation plus rapide et plus courte pour les vérifications null
peut être:
value == null ? "UNDEFINED" : value
Cette ligne est équivalente à:
if(value == null) {
console.log("UNDEFINED")
} else {
console.log(value)
}
Surtout quand vous avez beaucoup de null
, vérifiez que c'est une notation courte de Nice.
Je suis en retard pour rejoindre ce fil, mais je trouve ce piratage JavaScript très utile pour vérifier si une valeur est indéfinie
if(typeof(something) === 'undefined'){
// Yes this is undefined
}