【问题标题】:Adding a property to Array in Typescript在 Typescript 中向数组添加属性
【发布时间】:2019-11-12 03:51:28
【问题描述】:

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

【问题讨论】:

    标签: typescript


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢瑞恩。不,我没有使用 VS,使用tsc 编译时会出现此错误。另外我更改了接口的签名并开始使用function(),但仍然出现问题。
      • 您需要将该接口声明移至顶层,否则您只是声明了一个名为SelfAppraisalCalc.Array 的新类型。 Array.prototype 的赋值可以去任何地方(当然,只要它执行)。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2020-11-28
        • 2016-05-30
        • 2021-12-05
        • 2019-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-24
        相关资源
        最近更新 更多