Je suis tombé sur cette construction dans un exemple angulaire et je me demande pourquoi cela est choisi:
_ => console.log('Not using any parameters');
Je comprends que la variable _ signifie que je ne me soucie pas / n'est pas utilisé, mais comme c'est la seule variable, y a-t-il une raison de préférer l'utilisation de _ à:
() => console.log('Not using any parameters');
Il ne peut certainement pas s'agir d'un caractère de moins à taper. La syntaxe () transmet mieux l'intention à mon avis et est également plus spécifique au type car sinon, je pense que le premier exemple aurait dû ressembler à ceci:
(_: any) => console.log('Not using any parameters');
Au cas où cela importerait, c'était le contexte dans lequel il a été utilisé:
submit(query: string): void {
this.router.navigate(['search'], { queryParams: { query: query } })
.then(_ => this.search());
}
Réponses:
La raison pour laquelle ce style peut être utilisé (et peut-être pourquoi il a été utilisé ici) est qu'il
_
y a un caractère plus court que()
.Les parenthèses facultatives relèvent du même problème de style que les accolades facultatives . C'est une question de goût et de style de code pour la plupart, mais la verbosité est ici favorisée en raison de la cohérence.
Alors que les fonctions fléchées autorisent un seul paramètre sans parenthèses, il est incompatible avec zéro, un seul déstructuré, un seul repos et plusieurs paramètres:
Bien qu'une
is declared but never used
erreur ait été corrigée dans TypeScript 2.0 pour les paramètres soulignés, elle_
peut également déclencher ununused variable/parameter
avertissement à partir d'un linter ou d'un IDE. C'est un argument considérable contre cela._
peut être classiquement utilisé pour les paramètres ignorés (comme l'autre réponse déjà expliqué). Bien que cela puisse être considéré comme acceptable, cette habitude peut entraîner un conflit avec l'_
espace de noms Underscore / Lodash, cela semble également déroutant lorsqu'il y a plusieurs paramètres ignorés. Pour cette raison, il est avantageux d'avoir des paramètres soulignés correctement nommés (pris en charge dans TS 2.0), permet également de gagner du temps sur la détermination de la signature de la fonction et sur la raison pour laquelle les paramètres sont marqués comme ignorés (cela va à l'encontre de l'objectif du_
paramètre en tant que raccourci):Pour les raisons énumérées ci-dessus, je considérerais personnellement le
_ => { ... }
style de code comme une mauvaise tonalité à éviter.la source
(
vient généralement avec un)
.p
Pas exactement.
()
dit que la fonction n'attend aucun argument, elle ne déclare aucun paramètre. La fonction.length
est 0.Si vous utilisez
_
, il indique explicitement que la fonction recevra un argument, mais que vous ne vous en souciez pas. La fonction.length
sera 1, ce qui peut être important dans certains cadres.Donc, du point de vue du type, il peut être plus précis de le faire (surtout lorsque vous ne le tapez pas avec
any
mais, disons,_: Event
). Et comme vous l'avez dit, c'est un caractère de moins à taper, ce qui est également plus facile à atteindre sur certains claviers.la source
_
variables de fonction de flèche s inutilisées , je me demande s'il y a une différence de performance par rapport à l'utilisation()
Je suppose que
_ =>
c'est juste utilisé() =>
parce que_
c'est courant dans d'autres langues où il n'est pas autorisé à simplement omettre des paramètres comme dans JS._
est populaire dans Go et il est également utilisé dans Dart pour indiquer qu'un paramètre est ignoré et probablement d'autres que je ne connais pas.la source
_
a probablement été emprunté à des langages fonctionnels tels que ML et Haskell, où il est bien antérieur à l'invention de Python (sans parler de Go, Dart ou TypeScript).Il est possible de faire la distinction entre les deux usages, et certains frameworks l'utilisent pour représenter différents types de callbacks. Par exemple, je pense que le cadre express de nœuds utilise cela pour distinguer les types de middleware, par exemple, les gestionnaires d'erreurs utilisent trois arguments, tandis que le routage en utilise deux.
Une telle différenciation peut ressembler à l'exemple ci-dessous:
la source
Quand j'ai écrit le post, j'avais l'impression que
_
c'était le seul moyen de créer des fonctions fléchées sans()
, ce qui m'a amené à croire que l'utilisation_
pouvait avoir des avantages mineurs, mais je me suis trompé. @Halt a confirmé dans les commentaires qu'il se comporte comme les autres variables, ce n'est pas une construction de langage spéciale.Je veux mentionner une autre chose que j'ai réalisée à propos de ces fonctions de flèche de soulignement en me testant, je n'ai trouvé mentionné nulle part. Vous pouvez utiliser le trait de soulignement dans la fonction en tant que paramètre , bien que ce ne soit probablement pas l'usage prévu car il est censé représenter un paramètre inutilisé. Pour plus de clarté, je ne recommanderais pas vraiment de l'utiliser de cette façon.
mais il peut être utile de savoir pour des choses comme codegolf , des défis où vous écrivez le code le plus court(il s'avère que vous pouvez simplement utiliser n'importe quel caractère sans()
). Je pourrais imaginer des cas d'utilisation réels où les bibliothèques l'utilisent et vous devez l'utiliser même si elles n'ont pas l'intention d'utiliser cette fonctionnalité.Exemple:
Testé avec la console Chrome, version 76.0.3809.132 (version officielle) (64 bits)
la source
()
avant de publier ce message, je pensais que_
c'était le seul moyen de le faire, c'est pourquoi j'ai décidé de le souligner. Dans cet esprit, il s'avère que ce n'est rien de spécial à utiliser, même pour le golf, car vous pouvez simplement utiliser un personnage ordinaire. Mieux vaut simplement pour suivre les conventions, comme vous l'avez dit.