JavaScript
.
C'est ainsi que vous construisez des couches d'abstraction, imitant des classes, masquant des informations et des modules.
Dans TypeScript
, bien qu'il existe des classes, des espaces de noms et des modules,
les fonctions jouent toujours un rôle clé dans la description de la procédure à suivre.
TypeScript
ajoute également de nouvelles fonctionnalités aux fonctions JavaScript
standard pour faciliter leur utilisation.JavaScript
, les fonctions TypeScript
peuvent être créées à
la fois en tant que fonction nommée ou en tant que fonction anonyme. Cela vous permet de choisir l'approche la plus
appropriée pour votre application, que vous construisiez une liste de fonctions dans une API ou une fonction ponctuelle à transférer à une autre fonction.JavaScript
:JavaScript
et TypeScript
.TypeScript
peut comprendre le type de retour en examinant les instructions return
,
ce qui permet de le laisser éventuellement dans de nombreux cas.=>
) entre les paramètres et le type de retour.
Comme mentionné précédemment, il s'agit d'une partie obligatoire du type de fonction.
Par conséquent, si la fonction ne renvoie pas de valeur, vous utiliserez void au lieu de la laisser désactivée.TypeScript
peut déterminer le type si vous avez
des types d'un côté de l'équation mais pas de l'autre.null
ou undefined
, mais lorsque la fonction est appelée, le compilateur vérifie
que l'utilisateur a fourni une valeur pour chaque paramètre. Le compilateur suppose également que ces paramètres sont les seuls paramètres qui
seront transmis à la fonction. En bref, le nombre d'arguments donnés à une fonction doit correspondre au nombre de paramètres attendus par la fonction.JavaScript
, chaque paramètre est facultatif et les utilisateurs peuvent les laisser comme ils l'entendent.
Quand ils le font, leur valeur est indéfinie. Nous pouvons obtenir cette fonctionnalité dans TypeScript
en
ajoutant un ?
à la fin des paramètres, nous voulons être facultatifs.
Par exemple, supposons que nous voulions que le paramètre de nom de famille ci-dessus soit optionnel :TypeScript
, nous pouvons également définir une valeur à laquelle un paramètre sera attribué si l'utilisateur n'en fournit pas,
ou si l'utilisateur passe non défini à sa place. Ceux-ci sont appelés paramètres initialisés par défaut.
Prenons l'exemple précédent et définissons par défaut le nom de famille sur "Smith
".(firstName: string, lastName ?: string) => string
.
LastName
, la valeur par défaut, disparaît dans le type,
ne laissant que le fait que le paramètre soit facultatif.undefined
pour obtenir la valeur initialisée par défaut.
Par exemple, nous pourrions écrire notre dernier exemple avec uniquement un initialiseur par défaut sur firstName
:JavaScript
, vous pouvez utiliser les arguments directement à l'aide de la variable arguments visible dans chaque corps de fonction.TypeScript
, vous pouvez rassembler ces arguments dans une variable :rest
, vous pouvez en utiliser autant que vous le souhaitez vous pouvez même n'en passer aucun.
Le compilateur construira un tableau des arguments passés avec le nom donné après les points de suspension (...),
ce qui vous permettra de l'utiliser dans votre fonction.this
en JavaScript
est en quelque sorte un rite de passage.
Comme TypeScript
est un sur-ensemble de JavaScript
,
les développeurs de TypeScript
doivent également apprendre à les utiliser et à détecter
les cas où ils ne sont pas utilisés correctement. Heureusement, TypeScript
vous permet de détecter les utilisations incorrectes à l'aide de plusieurs techniques. JavaScript
, il s'agit d'une variable définie lors de l'appel d'une fonction.
Cela en fait une fonctionnalité très puissante et flexible, mais au prix de toujours avoir à connaître le contexte dans lequel une fonction s'exécute.
Cela est particulièrement déroutant, en particulier lorsque vous renvoyez une fonction ou que vous lui transmettez une argumentation.createCardPicker
est une fonction qui renvoie elle-même une fonction.
Si nous essayions d'exécuter l'exemple, nous obtiendrions une erreur au lieu du message d'alerte attendu.
Cela est dû au fait que cet objet utilisé dans la fonction créée par createCardPicker
sera défini sur window
au lieu de notre objet deck
. C'est parce que nous appelons cardPicker()
seul.
Un appel de syntaxe de niveau supérieur sans méthode comme ceci utilisera window pour cela.
(Remarque: en mode strict, ce sera non défini plutôt que fenêtre).ECMAScript 6
arrow
.
Les fonctions fléchées capturent le présent où la fonction est créée plutôt que où elle est appelée :TypeScript
vous avertira lorsque vous faites cette erreur si vous passez l'indicateur --noImplicitThis
au compilateur.
Il est à noter que ceci dans this.suits [pickSuit]
est du type any
.this.suits [pickSuit]
est encore inconnu.
C'est parce que cela vient de l'expression de la fonction dans le littéral de l'objet.
Pour résoudre ce problème, vous pouvez fournir un paramètre explicite à ce paramètre, ces paramètres sont de faux paramètres qui
apparaissent en premier dans la liste de paramètres d'une fonction :Card
and Deck
,
pour rendre les types plus clairs et plus faciles à réutiliser :TypeScript
sait que createCardPicker
s'attend à être appelé sur un objet Deck
.
Cela signifie que c'est de type Deck
maintenant, pas n'importe lequel, donc --noImplicitThis
ne causera aucune erreur.this: void
signifie que addClickListener
s'attend à ce que onclick
soit une fonction ne nécessitant pas ce type.
Deuxièmement, annotez votre code d'appel avec ceci:onClickBad
doit être appelé sur une instance de Handler
.
Ensuite, TypeScript
détectera que addClickListener
requiert une fonction qui a ceci : void
.
Pour corriger l'erreur, changez le type de ceci :onClickGood
spécifie que ce type est vide, il est légal de passer à addClickListener
.
Bien entendu, cela signifie également qu'il ne peut pas utiliser this.info
.
Si vous voulez les deux, vous devrez utiliser une fonction de flèche:void
.
L'inconvénient est qu'une fonction de flèche est créée par objet de type Handler
.
Les méthodes, en revanche, ne sont créées qu'une fois et attachées au prototype de Handler
.
Ils sont partagés entre tous les objets de type Handler
.JavaScript
est par nature un langage très dynamique.
Il n'est pas rare qu'une seule fonction JavaScript
renvoie différents types d'objets en fonction de la forme des arguments transmis.pickCard
renverra deux choses différentes en fonction de ce que l'utilisateur a transmis.
Si l'utilisateur passe dans un objet qui représente le deck
, la fonction choisira la carte.
Si l'utilisateur choisit la carte, nous lui indiquons quelle carte il a choisie.
Mais comment décrivons-nous cela au système de types ?pickCard
accepte et ce qu'elle renvoie.pickCard
.typecheck
, il suit un processus similaire au JavaScript
sous-jacent.
Il examine la liste de surcharge et poursuit avec la première tentative d'appeler la fonction avec les paramètres fournis.
S'il trouve une correspondance, il sélectionne cette surcharge comme étant la surcharge correcte.
Pour cette raison, il est habituel de classer les surcharges du plus spécifique au moins spécifique.pickCard(x)
: toute pièce ne fait pas partie de la liste de surcharge,
elle n'a donc que deux surcharges : une qui prend un objet et une qui prend un nombre.
L'appel de pickCard
avec tout autre type de paramètre provoquerait une erreur.