Editer 2014-01-28 :
Nouveaux lecteurs, ne manquez pas de consulter Réponse de Zac ci-dessous .
Il propose une solution beaucoup plus soignée qui vous permet de définir et d'instancier une fonction dans la définition de la classe à l'aide de la syntaxe fat arrow.
La seule chose que j'ajouterai est que, en ce qui concerne les option 5 dans la réponse de Zac, il est possible de spécifier la signature de la méthode et le type de retour sans aucune répétition en utilisant cette syntaxe :
public myMethod = (prop1: number): string => {
return 'asdf';
}
Editer 2013-05-28 :
La syntaxe pour définir un type de propriété de fonction a changé (depuis la version 0.8 de TypeScript).
Auparavant, vous définissiez un type de fonction comme suit :
class Test {
removeRow: (): void;
}
Il s'agit maintenant d'un changement :
class Test {
removeRow: () => void;
}
J'ai mis à jour ma réponse ci-dessous pour inclure ce nouveau changement.
Par ailleurs : Si vous devez définir plusieurs signatures de fonctions pour le même nom de fonction (par exemple, la surcharge de fonctions en cours d'exécution), vous pouvez utiliser la notation de carte d'objet (cette notation est largement utilisée dans le fichier descripteur de jQuery) :
class Test {
removeRow: {
(): void;
(param: string): string;
};
}
Vous devez définir la signature de removeRow()
en tant que propriété de votre classe, mais assignez l'implémentation dans le constructeur.
Il y a plusieurs façons de procéder.
Option 1
class Test {
// Define the method signature here.
removeRow: () => void;
constructor (){
// Implement the method using the fat arrow syntax.
this.removeRow = () => {
// Perform your logic to remove the row.
// Reference `this` as needed.
}
}
}
Si vous souhaitez que votre constructeur soit minimal, vous pouvez simplement conserver l'élément removeRow
dans la définition de la classe et assigner simplement une fonction proxy dans le constructeur :
Option 2
class Test {
// Again, define the method signature here.
removeRowProxy: () => void;
constructor (){
// Assign the method implementation here.
this.removeRowProxy = () => {
this.removeRow.apply(this, arguments);
}
}
removeRow(): void {
// ... removeRow logic here.
}
}
Option 3
Enfin, si vous utilisez une bibliothèque comme underscore ou jQuery, vous pouvez utiliser leur méthode utilitaire pour créer le proxy :
class Test {
// Define the method signature here.
removeRowProxy: () => void;
constructor (){
// Use jQuery to bind removeRow to this instance.
this.removeRowProxy = $.proxy(this.removeRow, this);
}
removeRow(): void {
// ... removeRow logic here.
}
}
Vous pouvez alors mettre de l'ordre dans votre deleteItem
un peu :
// Specify `Function` as the callback type.
// NOTE: You can define a specific signature if needed.
deleteItem(removeRowCallback: Function ): void {
$.ajax(action, {
data: { "id": id },
type: "POST"
})
// Pass the callback here.
//
// You don't need the fat arrow syntax here
// because the callback has already been bound
// to the correct scope.
.done(removeRowCallback)
.fail(() => {
alert("There was an error!");
});
}