5

我正在尝试向 Typescript 中的 Array 对象添加一个方法。我已经在 SO 上找到了其他解决方案,但这些都不适合我。

我的代码如下所示:

interface Array {
    average(): () => number;
}

Array.prototype.average = () => {
    var sum: number = 0

    for (var i = 0; i < this.length; i++)
        sum += this[i]

    if (this.length)
        return sum / this.length

    return 0
}

我得到了错误:The property 'average' does not exist on value of type 'Array'

4

3 回答 3

5

你只是在 Visual Studio 中得到一个错误吗?由于扩展内置接口中的错误,预计会有这么多。如果您只是调用 tsc.exe,这应该可以工作。

相关地,您的代码有点偏离 - 您的声明average描述了一个函数,该函数返回一个返回数字的函数,而不是返回一个数字(您只想写average(): number在该行上)。此外,因为您使用=>而不是function() {在实现中,您将this在运行时绑定到错误的值。希望有帮助!

于 2013-02-14T04:45:31.877 回答
5

这是非常简单的解决方案(使用 typescript 1.6 测试):

1)用数组类型定义方法:

interface Array<T> {
    average():number;
}

2)实现方法:

Array.prototype['average'] = function () {
    return this.reduce(function (a, b) {
        if(typeof a !== "number" || typeof b !== "number"){
            throw new Error("avg method applies only on numeric arrays.");
        }
        return a + b;
    }, 0) / this.length;
};

呈现的代码应该是:

Array.prototype.average = function()........

现在您可以将其称为:

var arr:number[] = [1, 2, 3, 4, 5, 6];
arr.average()
于 2015-11-06T19:04:27.877 回答
4

Vukasin 的回答是正确的,除了因为 Array 和 Number 一样是本机类型,您需要通过全局命名空间访问它来扩充它。所以你需要这样做......

declare global {
  interface Array<T> {
    average():number;
  }
}

那么你可以这样做: -

if(!Array.prototype.average )
{
  Array.prototype.average = function () {
    return this.reduce(function (a, b) {
        if(typeof a !== "number" || typeof b !== "number"){
            throw new Error("avg method applies only on numeric arrays.");
        }
        return a + b;
    }, 0) / this.length;
  }
}
于 2017-04-18T23:47:19.287 回答