编辑 2014-01-28:
新读者,请务必在下面查看Zac 的答案。
他有一个更简洁的解决方案,可以让您使用胖箭头语法在类定义中定义和实例化一个作用域函数。
我唯一要补充的是,关于Zac 答案中的选项 5,可以使用以下语法指定方法签名和返回类型而无需任何重复:
public myMethod = (prop1: number): string => {
return 'asdf';
}
编辑 2013-05-28:
定义函数属性类型的语法已更改(自 TypeScript 0.8 版以来)。
以前你会定义一个这样的函数类型:
class Test {
removeRow: (): void;
}
现在已更改为:
class Test {
removeRow: () => void;
}
我已在下面更新了我的答案以包含此新更改。
顺便说一句:如果您需要为同一个函数名称定义多个函数签名(例如运行时函数重载),那么您可以使用对象映射表示法(这在 jQuery 描述符文件中被广泛使用):
class Test {
removeRow: {
(): void;
(param: string): string;
};
}
您需要将签名定义为removeRow()
类的属性,但在构造函数中分配实现。
有几种不同的方法可以做到这一点。
选项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.
}
}
}
如果你想保持你的构造函数最小,那么你可以将removeRow
方法保留在类定义中,并在构造函数中分配一个代理函数:
选项 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.
}
}
选项 3
最后,如果您使用的是下划线或 jQuery 之类的库,那么您可以使用它们的实用方法来创建代理:
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.
}
}
然后你可以稍微整理一下你的deleteItem
方法:
// 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!");
});
}