在Typescript中向Array添加属性

时间:2013-02-14 04:06:59

标签: typescript

我正在尝试在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'

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

这是一个非常简单的解决方案(使用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 = funciton()........

现在您可以将其称为:

var arr:number[] = [1, 2, 3, 4, 5, 6];
arr.average()

答案 2 :(得分:2)

Vukasin的答案是正确的,因为数字,如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;
  }
}