TypeScript - 数组排序扩展方法

时间:2017-07-08 03:17:10

标签: javascript arrays typescript

我想在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[];

1 个答案:

答案 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;
}