Dans TypeScript, je peux déclarer un paramètre d'une fonction en tant que type Function. Existe-t-il un moyen «sûr de type» de faire cela qui me manque? Par exemple, considérez ceci:
class Foo {
save(callback: Function) : void {
//Do the save
var result : number = 42; //We get a number from the save operation
//Can I at compile-time ensure the callback accepts a single parameter of type number somehow?
callback(result);
}
}
var foo = new Foo();
var callback = (result: string) : void => {
alert(result);
}
foo.save(callback);
Le rappel de sauvegarde n'est pas de type sécurisé, je lui donne une fonction de rappel où le paramètre de la fonction est une chaîne mais je lui passe un nombre et compile sans erreur. Puis-je faire le paramètre de résultat dans enregistrer une fonction de type sécurisé?
Version TL; DR: existe-t-il un équivalent d'un délégué .NET en TypeScript?
la source
(n: number) => any
signifie toute signature de fonction?number
) mais le type de retour n'est pas du tout limité (peut être n'importe quelle valeur, ou mêmevoid
)n
cette syntaxe? Les types d'entrée et de sortie ne suffiraient-ils pas à eux seuls?Voici les équivalents TypeScript de certains délégués .NET courants:
la source
Action
et lesFunc
délégués à la fois parer à la plupart des types de besoin de délégué spécifique et, fait intéressant, donnent C # un semblant de structure de frappe. L'inconvénient de ces délégués est que leur nom n'a aucune signification, mais les autres avantages l'emportent généralement sur cela. Dans TypeScript, nous n'avons tout simplement pas besoin de ces types. L'anti-modèle serait doncfunction map<T, U>(xs: T[], f: Func<T, U>)
. Préférerfunction map<T, U>(xs: T[], f: (x: T) => U)
Je me rends compte que ce message est ancien, mais il existe une approche plus compacte légèrement différente de ce qui a été demandé, mais peut être une alternative très utile. Vous pouvez essentiellement déclarer la fonction en ligne lors de l' appel de la méthode (
Foo
« ssave()
dans ce cas). Cela ressemblerait à quelque chose comme ceci:L'
multipleCallback()
approche est très utile pour des choses comme les appels réseau qui peuvent réussir ou échouer. En supposant à nouveau un exemple d'appel réseau, lorsqu'ilmultipleCallbacks()
est appelé, le comportement à la fois pour un succès et un échec peut être défini en un seul endroit, ce qui se prête à une plus grande clarté pour les futurs lecteurs de code.En général, d'après mon expérience, cette approche se prête à être plus concise, moins encombrante et plus claire dans l'ensemble.
Bonne chance à tous!
la source
Cela correspond certainement au paradigme de programmation fonctionnelle.
la source
inputType
plutôt quereturnType
, n'est-ce pas? OùinputType
est le typedata
dont vous passez un paramètre à lacallback
fonction.Dans TS, nous pouvons taper les fonctions de la manière suivante:
Types de fonctions / signatures
Ceci est utilisé pour des implémentations réelles de fonctions / méthodes, il a la syntaxe suivante:
Exemple:
Type de fonction Littéraux
Les littéraux de type de fonction sont une autre façon de déclarer le type d'une fonction. Ils sont généralement appliqués dans la signature de fonction d'une fonction d'ordre supérieur. Une fonction d'ordre supérieur est une fonction qui accepte des fonctions comme paramètres ou qui renvoie une fonction. Il a la syntaxe suivante:
Exemple:
la source
Si vous définissez d'abord le type de fonction, il ressemblerait à
Sans type de fonction en utilisant la syntaxe de propriété simple, ce serait:
Si vous voulez en utilisant une fonction d'interface comme les délégués génériques c #, ce serait:
la source
Outre ce que d'autres ont dit, un problème commun est de déclarer les types de la même fonction qui est surchargée. Le cas typique est la méthode EventEmitter on () qui accepte plusieurs types d'écouteurs. Une situation similaire peut se produire lorsque vous travaillez avec des actions redux - et là, vous utilisez le type d'action comme littéral pour marquer la surcharge. Dans le cas d'EventEmitters, vous utilisez le type littéral du nom de l'événement:
la source