我正在尝试在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'
答案 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;
}
}