web-dev-qa-db-fra.com

Remplacement de l'opérateur Elvis d'Angular2 en tapuscrit

Y a-t-il un opérateur dans le TypeScript qui est utilisé de manière similaire à Elvis Operator de angular2, je veux dire, disons que je dois récupérer la clé d'un objet comme celui-ci:

this.myForm.name.first_name

et si le prénom n'existe pas, il générera l'erreur first_name of undefined,

oui je peux gérer cette erreur en utilisant Ternary operator de TypeScript comme celui-ci

this.myForm.name ? this.myForm.name.first_name : ''

mais parfois les clés deviennent trop longues,

y a-t-il un opérateur comme Elvis Operator de angular2 dans le TypeScript afin que je puisse utiliser comme ça

this.myForm?.name?.first_name
29
Pardeep Jain

Il n'y a pas d'opérateur elvis dans TypeScript et, pour autant que je sache, rien de comparable non plus.

Pour une référence, voir la demande de fonctionnalité sur Suggestion: "opérateur de navigation sûr", c'est-à-dire x? .Y . explication pour ne pas l'implémenter est la suivante (ce qui, à mon avis, est une raison valable):

Fermeture pour l'instant. Puisqu'il n'y a vraiment rien de spécifique à TypeScript qui l'exigerait au niveau de l'expression, ce type de changement majeur d'opérateur devrait se produire au comité des spécifications ES plutôt qu'ici.

Les tripwires généraux pour réévaluer ceci seraient une proposition ES concrète atteignant l'étape suivante, ou un consensus général du comité ES que cette fonctionnalité ne se produirait pas pendant longtemps (afin que nous puissions définir notre propre sémantique et être raisonnablement sûr qu'ils "gagneraient").

Des alternatives à cette notation seraient d'utiliser l'opérateur logique AND, try/catch ou une fonction d'aide comme getSafe(() => this.myForm.name.first_name) comme décrit dans ce post .


Mise à jour de juillet 2017: Comme JGFMK l'a souligné dans les commentaires, il existe une proposition ECMAScript appelée Chaînage facultatif pour JavaScript . Si/lorsque la proposition atteint l'étape 4, elle sera ajoutée à la spécification linguistique.

29
str

À plusieurs reprises OR avec un objet vide

Je ne peux pas vivre sans Elvis lorsque j'écris du HTML qui référence des propriétés/sous-propriétés qui peuvent ou non exister.

Nous ne pouvons pas écrire

this.myForm?.name?.first_name

Je suppose que les responsables d'ES passent probablement la plupart de leur temps à écrire JS, et non à écrire des bits de HTML frontal qui accède aux propriétés des objets, d'où leur perplexité quant à la raison pour laquelle quelqu'un aurait besoin d'une navigation sécurisée.

Ils soutiennent que "Personne n'en a besoin", "Il permet aux erreurs de se taire et pourrait ainsi vous mordre plus tard" et "Comment interpréteriez-vous x?(y)?"

Ma solution, en attendant qu'une future spécification ES inclue l'opérateur Elvis, est la suivante:

(((this.myForm || {}).name || {}).first_name )

En bref, à chaque étape où une valeur pourrait être undefined, vous OR avec un {}, De sorte que l'indéfini devienne un objet vide. Une fois que vous avez mis tout cela entre parenthèses, vous pouvez essayer d'en extraire une propriété, car toute propriété que vous essayez d'extraire de {} Est simplement undefined plutôt qu'une erreur réelle.

Cela devient un peu moche lorsque vous avez plusieurs niveaux, mais dans de nombreux cas, c'est moins moche que d'avoir à utiliser une série de && Pour descendre progressivement à travers les niveaux de l'objet.

Pour l'accès au tableau, OR avec un tableau vide

Si vous naviguez dans un tableau, par exemple si le formulaire a plusieurs noms et que vous souhaitez sélectionner le premier, l'approche est similaire:

((((this.myForm || {}).names || [])[0] || {}).first_name )
4
Eureka