【问题标题】:how to extend Array<T> in typescript如何在打字稿中扩展 Array<T>
【发布时间】:2017-01-15 05:42:08
【问题描述】:

"Typescript extend String Static"的帖子中,我得到了一些我们可以扩展现有的打字稿基类,例如,添加新方法

interface StringConstructor {
   isNullOrEmpty(str:string):boolean;
}
String.isNullOrEmpty = (str:string) => !str;

确实有效。但是对于通用接口,我遇到了问题。例如,我需要在 Array 中添加新方法 contains()。我使用以下代码:

   //1
    interface Array<T> {
        contain(item: T): boolean;
    }  
    //2
    ?????? = (item: T) => {
    // ....
        return true;
    };

在第 1 步之后,在 VS intellisense 中会弹出包含方法,但我在哪里可以实现方法?

【问题讨论】:

标签: typescript


【解决方案1】:

由于接口中的定义已经绑定到泛型约束,在实现中你可以把它当作any:

interface Array<T> {
    contain(item: T): boolean;
}  

Array.prototype.contain = function(item) {
    return this.some(obj => item == obj);
};

另外,不要对原型方法使用箭头函数,原因如下:

interface Array<T> {
    fn(): void;
}

Array.prototype.fn = () => {
    console.log(this);
};

let a = [];
a.fn(); // Window

但是:

Array.prototype.fn = function() {
    console.log(this);
};

let a = [];
a.fn(); // []

如果您的目标是 es5 或更低,那么编译器会将箭头函数转换为常规函数并不重要,但如果您随后切换到目标 es6(并且箭头函数将持续存在),那么您的代码会中断,你不会明白为什么。

【讨论】:

  • 嗨 Nitzan,感谢您的回答...如果将其实现为实例方法,则应与 .net 框架中的相同。我发现是否使用箭头函数,intellisense提示参数项是any,并且没有必须在方法体中使用的数组本身..关于在方法体中获取数组的任何建议?
  • 应该是实例方法还是静态方法?根据您发布的签名,它是一个实例方法是有道理的。该项目是您在数组中寻找的东西,不是吗?如果是这样,它应该是any
  • 我喜欢通过实例方法来做,因为我是 .net 开发人员..:-) 我关心的是方法体,我无法获取数组 [],我需要数组 [] 和项目已传入写入包含逻辑...
  • 数组只是this,因为您将此方法添加到Array 对象原型。如我的示例:return this.some(obj =&gt; item == obj)this.some 方法是 Array.prototype.some 方法。
  • 知道了。我所做的一切都是基于 vs intellisense,但它在这里不起作用......再次感谢 Nitzan..
猜你喜欢
  • 1970-01-01
  • 2021-06-18
  • 2016-07-04
  • 2021-08-10
  • 2022-07-05
  • 2020-03-26
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
相关资源
最近更新 更多