我想在TypeScript中创建一个数组扩展“sort”方法,其中数组可以由各种对象类型组成。我可以从任何组件调用此扩展方法。
这种类需要接受一个对象属性来排序(当然属性可以是数字或字符串)和枚举类型的方向(升序1或降序-1)。我有数组,我有sortDirection的枚举。但是我在哪里/如何构建排序方法来像这样调用它?
myArrayOfObjects.sort('name', sortDirection.Descending);
这是我现有的组件级排序,我试图将其转换为可以从任何地方调用的扩展方法。将方向转换为枚举并将其传递给它很容易,但我真的试图将其作为扩展方法:
sort(property: string): void {
this.isDescending = !this.isDescending;
this.column = property;
const direction = this.isDescending ? 1 : -1;
this.searchResults.sort(function (a, b) {
if (a[property] < b[property]) {
return -1 * direction;
} else if (a[property] > b[property]) {
return 1 * direction;
} else {
return 0;
}
});
this.currentPage = 0;
}
this.searchResults如下所示,但它可以是任何数组或任何具有属性的对象。同样,这是一个组件级函数,我想将其转换为数组的扩展方法:
@Input() searchResults: IPersonSummary[];
答案 0 :(得分:2)
因为TypeScript已经加载了基本类型,其中定义了具有名称排序的方法,所以您无法使用相同的名称重新定义它。如果您考虑使用一些不同的名称(例如我选择mySort),您可以这样做。您需要在Array接口中定义它并将您的函数分配给Array原型。 使用新名称定义extend是最佳实践,因为您无法在覆盖某些基本方法时调用基本方法。如果您考虑将来某个时候调用基本方法,那么您将遇到大麻烦。
推荐的方法:
interface Array<T> {
mySort(property: string): void;
}
Array.prototype.mySort = function (property: string): void {
this.isDescending = !this.isDescending;
this.column = property;
const direction = this.isDescending ? 1 : -1;
this.searchResults.sort(function (a, b) {
if (a[property] < b[property]) {
return -1 * direction;
} else if (a[property] > b[property]) {
return 1 * direction;
} else {
return 0;
}
});
this.currentPage = 0;
}