如何在typescript中扩展Array <t>

时间:2017-01-15 05:42:09

标签: typescript

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

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

在step1之后,在VS intellisense中弹出包含方法,但是我在哪里可以实现方法?

1 个答案:

答案 0 :(得分:3)

由于接口中的定义已经绑定到泛型约束,因此在实现中您可以将其视为任何约束:

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(和箭头函数将持续存在)然后您的代码将中断,您不会理解为什么。