É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?
typescript
null-check
David Liu
la source
la source
Since TypeScript is strongly-typed
Je n'ai pas trouvé ça dans ses documents et j'ai des doutes à ce sujet ...Réponses:
À l'aide d'un test de jonglage, vous pouvez tester les deux
null
etundefined
en un coup: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:Vous pouvez essayer cela avec différentes valeurs en utilisant cet exemple:
Production
la source
"false" == false
une chaîne non vide comme "false" est évaluéetrue
.if(x)
vérifications de style véridique / falsey , mais nonif(x == null)
, qui ne fait qu'attrapernull
etundefined
. Vérifiez quevar c: number = 0; check(c, 'b');
ce n'est pas "nully",,null
ouundefined
.évaluera
true
si cevalue
n'est pas le cas:null
undefined
NaN
''
0
false
tapuscrit inclut des règles javascript.
la source
TypeScript comprend parfaitement la version JavaScript qui est
something == null
.TypeScript exclura correctement à la fois
null
etundefined
avec de telles vérifications.Plus
https://basarat.gitbook.io/typescript/recap/null-undefined
la source
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 simplementsomething
).!!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/
donne:
donc:
la source
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.
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.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
le code ci-dessus vérifiera
null
etundefined
, MAIS dans le cas où lamessage
variable pourrait ne pas être déclarée (par sécurité), vous pouvez considérer le code suivantRemarque: 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 quemessage != null
, merci @Jaider.la source
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:
ce code vérifiera si foo est défini sinon il retournera non défini
ancienne façon :
cette:
Avec le chaînage optionnel sera:
une autre nouvelle fonctionnalité est Nullish Coalescing , par exemple:
ancienne façon:
la source
Vous voudrez peut-être essayer
avec
!!
.Explication
Le premier
!
transformera votre expression enboolean
valeur.Alors
!someValue
c'esttrue
sisomeValue
est faux etfalse
sisomeValue
c'est vrai . Cela pourrait prêter à confusion.En ajoutant un autre
!
, l'expression est maintenanttrue
sisomeValue
est vraie etfalse
sisomeValue
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 çaif (someValue)
m'aurait donné le même résultat?Parce que
!!someValue
c'est précisément une expression booléenne, alors qu'ellesomeValue
pourrait être absolument n'importe quoi. Ce type d'expression permettra désormais d'écrire des fonctions (et Dieu nous en avons besoin) comme:au lieu de:
J'espère que ça aide.
la source
!!'false'
est en actetrue
car'false'
est une chaîne valideCar
Typescript 2.x.x
vous devez le faire de la manière suivante (en utilisant type guard ):tl; dr
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:
Exemple 2 - les types respectent:
la source
c'est méchant!
la source
true
oufalse
seulement. Si vous avez un booléen avec unenull
affectation ou uneundefined
valeur, dans les deux cas, la valeur sera évaluée commefalse
.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 simplement
value == 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 queType | null | undefined
.la source
Si vous voulez passer
tslint
sans mettrestrict-boolean-expressions
àallow-null-union
ouallow-undefined-union
, vous devez utiliserisNullOrUndefined
dunode
« sutil
module ou rouler votre propre:Pas exactement du sucre syntaxique mais utile lorsque vos règles tslint sont strictes.
la source
Une notation plus rapide et plus courte pour les
null
chèques peut être:Cette ligne équivaut à:
Surtout quand vous avez beaucoup de
null
contrôle, c'est une belle notation courte.la source
J'ai eu ce problème et une partie de la réponse fonctionne très bien pour
JS
mais pas pourTS
ici est la raison.C'est très bien car JS n'a pas de types
Dans TS si la variable n'a pas été définie avec
null
lorsque vous essayez de vérifier quenull
letslint
| le compilateur se plaindra.la source
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
la source
En général , je fais le contrôle de la jonglerie comme Fenton déjà discuté . Pour le rendre plus lisible, vous pouvez utiliser isNil de ramda.
la source
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:
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 unboolean
type, évaluez simplement si sa valeur est vraie, cela sera évalué selon le type de constante / variable. Unetrue
chaîne doit être définie explicitement en tant que chaîne à l'aide de l'= ''
affectation. Sinon, il sera évalué commefalse
. Vérifions ce cas en utilisant le même contexte:la source
vous pouvez utiliser
la source
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:
Résultat:
lien plunkr: https://plnkr.co/edit/BJpVHD95FhKlpHp1skUE
la source
null
. Essayez ceci: plnkr.co/edit/NfiVnQNes1p8PvXd1fCG?p=previewPuisque 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()
.Arguments
valeur (*): La valeur à vérifier.
Retour
(booléen) : retourne vrai si la valeur est nulle, sinon faux.
Exemple
Lien
Lodash Docs
la source
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:
Les gens peuvent trouver cela utile: https://github.com/angular/components/blob/master/src/cdk/coercion/boolean-property.spec.ts
la source
Je l'écris toujours comme ceci:
Cela fonctionnera bien et je pense que c'est très lisible.
la source
0
réussit également le!foo
test.undefined
est différent defalse
. 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é?