扩展Array.prototype

时间:2017-07-05 09:43:14

标签: typescript

我可以扩展Array.prototype并在javascript中使用它:

Object.defineProperty(Array.prototype, 'flatten', {
  value: function flatten() {
      return this.reduce((a, b) => a.concat(b), []);
  }
});

// that allows me to do:
[1, 2, [3, 4]].flatten(); // [1,2,3,4]
[1, 2, [3, 4]].map(e => 5).flatten(); // [5, 5, 5]

但是在打字稿下我得到一个错误:属性'flatten'在类型'Array []'上不存在。

我可以避免做类似下面这样的事情,但是这对于获得流畅的界面并不好......它更难以阅读。

 (<any>[1, 2, [3, 4]]).flatten()
 ([1, 2, [3, 4]].map(e => 5) as any).flatten()

我可以在打字稿中做些什么来避免任何投射吗?就像让我们动态地了解typescript而不是Array类型的代码有另一种方法。

1 个答案:

答案 0 :(得分:4)

您可以扩展Array<T>界面以添加flatten方法:

declare global {
    interface Array<T> {
        flatten(): T[]
    }
}

请注意,只有当您在模块内时,才需要将其包含在declare global内。见merging interfaces.